python - Is it possible to declare relationship after class is created by automap in SqlAlchemy -
i'm new sqlalchemy. have followed tutorial create automap of existing db relationship mysql db
from sqlalchemy import create_engine, metadata, column, table, foreignkey sqlalchemy.ext.automap import automap_base, generate_relationship sqlalchemy.orm import relationship, backref config import constr, mytables def _gen_relationship(base, direction, return_fn, attrname, local_cls, refferred_cls, **kw): return generate_relationship(base, direction, return_fn, attrname, local_cls, refferred_cls, **kw) engine = create_engine(constr) metadata = metadata() metadata.reflect(engine, only=mytables) base = automap_base(metadata=metadata) base.prepare(engine, reflect=true, generate_relationship=_gen_relationship) tableclass1 = base.classes.table1 tableclass2 = base.classes.table2
table2.id
maps 1 of table1
's columns. when trying use query , join table1
, table2
, reports error saying "can't find foreign key relationships". since know relationship of these 2 tables, there way me declare relationship after class instance has been created? or there way explicitly tell relationship in query function? thanks!
while possible in query @mpolednik mentioned, if read question correctly, ideal solution have relationship declared in classes repeated use.
it can achieved pre-declaring class wish use, so:
from sqlalchemy.ext.automap import automap_base sqlalchemy.orm import session, relationship sqlalchemy import create_engine, column, string base = automap_base() engine = create_engine("postgresql://user:pass@localhost:5432/mydb") # pre-declare user 'user' table class user(base): __tablename__ = 'user' # override schema elements columns oname = column('originalname', string) # , relationship. name 'weird' because in database schema # relationship makes absolutely no sense, demonstrate # point weird = relationship("usergroup", foreign_keys='usergroup.id', primaryjoin='and_(usergroup.id==user.id)') base.prepare(engine, reflect=true) session = session(engine) # test querying user table , following relationship u = session.query(user).filter(user.oname == 'testuser').one() print (u.oname) g in u1.weird: print g.name
see here docs (including example): http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html?highlight=automap#specifying-classes-explicitly
Comments
Post a Comment