from pony import orm
db = orm.Database()
class Enseignant(db.Entity):
e_mail_ens = orm.PrimaryKey(str)
nom = orm.Required(str)
prénom = orm.Required(str)
tel = orm.Optional(str)
responsabilités = orm.Set('UE')
séances = orm.Set('Séance')
class UE(db.Entity):
code_UE = orm.PrimaryKey(str)
intitulé = orm.Required(str)
semestre = orm.Required(int)
crédit = orm.Optional(int)
responsable = orm.Required(Enseignant)
séances = orm.Set('Séance')
class Séance(db.Entity):
id_séance = orm.PrimaryKey(int, auto=True)
type = orm.Required(str)
salle = orm.Required(str)
date = orm.Required(str)
heure = orm.Required(str)
enseignant = orm.Required(Enseignant)
matière = orm.Required(UE)
orm.show(Séance)
class Séance(Entity): id_séance = PrimaryKey(int, auto=True) type = Required(str) salle = Required(str) date = Required(str) heure = Required(str) enseignant = Required(Enseignant) matière = Required(UE)
orm.set_sql_debug(True)
db.bind(provider='sqlite', filename=':memory:')
GET NEW CONNECTION RELEASE CONNECTION
db.generate_mapping(create_tables=True)
GET CONNECTION FROM THE LOCAL POOL PRAGMA foreign_keys = false BEGIN IMMEDIATE TRANSACTION CREATE TABLE "Enseignant" ( "e_mail_ens" TEXT NOT NULL PRIMARY KEY, "nom" TEXT NOT NULL, "prénom" TEXT NOT NULL, "tel" TEXT NOT NULL ) CREATE TABLE "UE" ( "code_UE" TEXT NOT NULL PRIMARY KEY, "intitulé" TEXT NOT NULL, "semestre" INTEGER NOT NULL, "crédit" INTEGER, "responsable" TEXT NOT NULL REFERENCES "Enseignant" ("e_mail_ens") ) CREATE INDEX "idx_ue__responsable" ON "UE" ("responsable") CREATE TABLE "Séance" ( "id_séance" INTEGER PRIMARY KEY AUTOINCREMENT, "type" TEXT NOT NULL, "salle" TEXT NOT NULL, "date" TEXT NOT NULL, "heure" TEXT NOT NULL, "enseignant" TEXT NOT NULL REFERENCES "Enseignant" ("e_mail_ens"), "matière" TEXT NOT NULL REFERENCES "UE" ("code_UE") ) CREATE INDEX "idx_séance__enseignant" ON "Séance" ("enseignant") CREATE INDEX "idx_séance__matière" ON "Séance" ("matière") SELECT "Enseignant"."e_mail_ens", "Enseignant"."nom", "Enseignant"."prénom", "Enseignant"."tel" FROM "Enseignant" "Enseignant" WHERE 0 = 1 SELECT "Séance"."id_séance", "Séance"."type", "Séance"."salle", "Séance"."date", "Séance"."heure", "Séance"."enseignant", "Séance"."matière" FROM "Séance" "Séance" WHERE 0 = 1 SELECT "UE"."code_UE", "UE"."intitulé", "UE"."semestre", "UE"."crédit", "UE"."responsable" FROM "UE" "UE" WHERE 0 = 1 COMMIT PRAGMA foreign_keys = true CLOSE CONNECTION
#paul = Enseignant(e_mail_ens = "ppoitevin@ec-m.fr", nom = "Poitevin", prénom = "Paul")
#orm.commit()
paul = Enseignant.get(e_mail_ens = "ppoitevin@ec-m.fr")
martin = Enseignant(e_mail_ens = "mmollo@ec-m.fr", nom = "Mollo", prénom = "Martin")
orm.commit()
#martin = Enseignant.get(e_mail_ens = "mmollo@ec-m.fr")
BEGIN IMMEDIATE TRANSACTION INSERT INTO "Enseignant" ("e_mail_ens", "nom", "prénom", "tel") VALUES (?, ?, ?, ?) ['mmollo@ec-m.fr', 'Mollo', 'Martin', ''] COMMIT
info = UE(code_UE = 'INF_1', intitulé = 'Informatique', semestre = 5, responsable = paul )
orm.commit()
#info = UE.get(code_UE = 'INF_1')
BEGIN IMMEDIATE TRANSACTION INSERT INTO "UE" ("code_UE", "intitulé", "semestre", "responsable") VALUES (?, ?, ?, ?) ['INF_1', 'Informatique', 5, 'ppoitevin@ec-m.fr'] COMMIT
s1 = Séance(type = 'CM', salle = 'Amphi 2', date = '2018-09-22', heure = '8:00', enseignant = paul, matière = info)
s2 = Séance(type = 'TD', salle = '222', date = '2018-09-22', heure = '10:15', enseignant = martin, matière = info)
orm.commit()
BEGIN IMMEDIATE TRANSACTION INSERT INTO "Séance" ("type", "salle", "date", "heure", "enseignant", "matière") VALUES (?, ?, ?, ?, ?, ?) ['CM', 'Amphi 2', '2018-09-22', '8:00', 'ppoitevin@ec-m.fr', 'INF_1'] INSERT INTO "Séance" ("type", "salle", "date", "heure", "enseignant", "matière") VALUES (?, ?, ?, ?, ?, ?) ['TD', '222', '2018-09-22', '10:15', 'mmollo@ec-m.fr', 'INF_1'] COMMIT
print(paul)
Enseignant['ppoitevin@ec-m.fr']
print(paul.prénom, paul.nom)
Paul Poitevin
print(info)
UE['INF_1']
print(info.intitulé)
Informatique
enseignants = Enseignant.select()
enseignants.show()
e_mail_ens |nom |prénom|tel -----------------+--------+------+--- ppoitevin@ec-m.fr|Poitevin|Paul | mmollo@ec-m.fr |Mollo |Martin|
paul.séances.select()[:]
SELECT "s"."id_séance", "s"."type", "s"."salle", "s"."date", "s"."heure", "s"."enseignant", "s"."matière" FROM "Séance" "s" WHERE "s"."enseignant" = ? ['ppoitevin@ec-m.fr']
[Séance[1]]
paul.séances.select().show()
id_séance|type|salle |date |heure|enseignant |matière ---------+----+-------+----------+-----+----------------------------+----------- 1 |CM |Amphi 2|2018-09-22|8:00 |Enseignant['ppoitevin@ec-...|UE['INF_1']
paul.responsabilités.select().show()
SELECT "ue"."code_UE", "ue"."intitulé", "ue"."semestre", "ue"."crédit", "ue"."responsable" FROM "UE" "ue" WHERE "ue"."responsable" = ? ['ppoitevin@ec-m.fr'] code_UE|intitulé |semestre|crédit|responsable -------+------------+--------+------+------------------------------- INF_1 |Informatique|5 |None |Enseignant['ppoitevin@ec-m.fr']
@orm.db_session
def affiche_enseigant(e_mail_ens):
e = Enseignant[e_mail_ens]
print('Nom:', e.nom)
print('Prénom:', e.prénom)
print('Téléphone:', e.tel)
print('Responsabilités :', e.responsabilités)
print('Séances :', e.séances)
# database session cache will be cleared automatically
# database connection will be returned to the pool
affiche_enseigant("ppoitevin@ec-m.fr")
Nom: Poitevin Prénom: Paul Téléphone: Responsabilités : UESet([UE['INF_1']]) Séances : SéanceSet([Séance[1]]) COMMIT RELEASE CONNECTION
@orm.db_session
def ajoute_séance(e_mail_ens, code_UE, salle, date, heure, type):
Séance(salle = salle, date = date, heure = heure, type = type,
enseignant = Enseignant[e_mail_ens],
matière = UE[code_UE])
# commit() will be done automatically
# database session cache will be cleared automatically
# database connection will be returned to the pool
ajoute_séance("ppoitevin@ec-m.fr", "INF_1", "222", "2018-09-22", "13:30", "TD")
GET CONNECTION FROM THE LOCAL POOL SWITCH TO AUTOCOMMIT MODE SELECT "e_mail_ens", "nom", "prénom", "tel" FROM "Enseignant" WHERE "e_mail_ens" = ? ['ppoitevin@ec-m.fr'] SELECT "code_UE", "intitulé", "semestre", "crédit", "responsable" FROM "UE" WHERE "code_UE" = ? ['INF_1'] BEGIN IMMEDIATE TRANSACTION INSERT INTO "Séance" ("type", "salle", "date", "heure", "enseignant", "matière") VALUES (?, ?, ?, ?, ?, ?) ['TD', '222', '2018-09-22', '13:30', 'ppoitevin@ec-m.fr', 'INF_1'] COMMIT RELEASE CONNECTION
with orm.db_session:
Séance[3].salle = '224'
# commit() will be done automatically
# database session cache will be cleared automatically
# database connection will be returned to the pool
GET CONNECTION FROM THE LOCAL POOL SWITCH TO AUTOCOMMIT MODE SELECT "id_séance", "type", "salle", "date", "heure", "enseignant", "matière" FROM "Séance" WHERE "id_séance" = ? [3] BEGIN IMMEDIATE TRANSACTION UPDATE "Séance" SET "salle" = ? WHERE "id_séance" = ? ['224', 3] COMMIT RELEASE CONNECTION
Séance[3].heure = '15:45'
orm.commit()
GET CONNECTION FROM THE LOCAL POOL SWITCH TO AUTOCOMMIT MODE SELECT "id_séance", "type", "salle", "date", "heure", "enseignant", "matière" FROM "Séance" WHERE "id_séance" = ? [3] BEGIN IMMEDIATE TRANSACTION UPDATE "Séance" SET "heure" = ? WHERE "id_séance" = ? ['15:45', 3] COMMIT
Séance.select().show()
BEGIN IMMEDIATE TRANSACTION SELECT "s"."id_séance", "s"."type", "s"."salle", "s"."date", "s"."heure", "s"."enseignant", "s"."matière" FROM "Séance" "s" id_séance|type|salle |date |heure|enseignant |matière ---------+----+-------+----------+-----+----------------------------+----------- 1 |CM |Amphi 2|2018-09-22|8:00 |Enseignant['ppoitevin@ec-...|UE['INF_1'] 2 |TD |222 |2018-09-22|10:15|Enseignant['mmollo@ec-m.fr']|UE['INF_1'] 3 |TD |224 |2018-09-22|15:45|Enseignant['ppoitevin@ec-...|UE['INF_1']
s = orm.select(s for s in Séance if s.type == 'TD')
s.show()
SELECT "s"."id_séance", "s"."type", "s"."salle", "s"."date", "s"."heure", "s"."enseignant", "s"."matière" FROM "Séance" "s" WHERE "s"."type" = 'TD' id_séance|type|salle|date |heure|enseignant |matière ---------+----+-----+----------+-----+------------------------------+----------- 2 |TD |222 |2018-09-22|10:15|Enseignant['mmollo@ec-m.fr'] |UE['INF_1'] 3 |TD |224 |2018-09-22|15:45|Enseignant['ppoitevin@ec-m....|UE['INF_1']
s = orm.select(s for s in Séance if (s.enseignant == paul and s.type == 'TD'))
s.show()
SELECT "s"."id_séance", "s"."type", "s"."salle", "s"."date", "s"."heure", "s"."enseignant", "s"."matière" FROM "Séance" "s" WHERE "s"."enseignant" = ? AND "s"."type" = 'TD' ['ppoitevin@ec-m.fr'] id_séance|type|salle|date |heure|enseignant |matière ---------+----+-----+----------+-----+------------------------------+----------- 3 |TD |224 |2018-09-22|15:45|Enseignant['ppoitevin@ec-m....|UE['INF_1']
orm.show(paul)
instance of Enseignant
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-34-7b4ee3b625fd> in <module>() ----> 1 orm.show(paul) /usr/local/lib/python3.5/dist-packages/pony/orm/core.py in show(entity) /usr/local/lib/python3.5/dist-packages/pony/utils/utils.py in cut_traceback(func, *args, **kwargs) 76 if module_name.startswith('pony.utils') and tb.tb_frame.f_code.co_name == 'throw': 77 reraise(exc_type, exc, last_pony_tb) ---> 78 reraise(exc_type, exc, full_tb) 79 finally: 80 del exc, full_tb, tb, last_pony_tb /usr/local/lib/python3.5/dist-packages/pony/utils/utils.py in reraise(***failed resolving arguments***) 93 else: 94 def reraise(exc_type, exc, tb): ---> 95 try: raise exc.with_traceback(tb) 96 finally: del exc, tb 97 /usr/local/lib/python3.5/dist-packages/pony/utils/utils.py in cut_traceback(func, *args, **kwargs) 59 return func(*args, **kwargs) 60 ---> 61 try: return func(*args, **kwargs) 62 except AssertionError: raise 63 except Exception: /usr/local/lib/python3.5/dist-packages/pony/orm/core.py in show(entity) 6136 # print(' %s: %s' % (attr.name, strcut(value, width-len(attr.name)-4))) 6137 # print() -> 6138 QueryResult([ x ], None, x.__class__, None).show() 6139 elif isinstance(x, (basestring, types.GeneratorType)): 6140 select(x).show() /usr/local/lib/python3.5/dist-packages/pony/orm/core.py in __init__(self, query, limit, offset, lazy) 5975 __slots__ = '_query', '_limit', '_offset', '_items', '_expr_type', '_col_names' 5976 def __init__(self, query, limit, offset, lazy): -> 5977 translator = query._translator 5978 self._query = query 5979 self._limit = limit AttributeError: 'list' object has no attribute '_translator'