Python 在自动映射在SqlAlchemy中创建类之后,是否可以声明关系
我是炼金术新手。我按照教程创建了现有数据库的自动映射,并从mysql数据库建立了关系Python 在自动映射在SqlAlchemy中创建类之后,是否可以声明关系,python,mysql,sqlalchemy,relationship,automap,Python,Mysql,Sqlalchemy,Relationship,Automap,我是炼金术新手。我按照教程创建了现有数据库的自动映射,并从mysql数据库建立了关系 from sqlalchemy import create_engine, MetaData, Column, Table, ForeignKey from sqlalchemy.ext.automap import automap_base, generate_relationship from sqlalchemy.orm import relationship, backref from config i
from sqlalchemy import create_engine, MetaData, Column, Table, ForeignKey
from sqlalchemy.ext.automap import automap_base, generate_relationship
from sqlalchemy.orm import relationship, backref
from 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
映射到table1
的一列。但是,当我尝试使用query和jointable1
和table2
时,它报告错误,说“找不到任何外键关系”。既然我知道这两个表之间的关系,有没有办法在创建类实例后声明这个关系?或者有没有办法在查询函数中显式地说明这种关系?
谢谢 您可以通过使用join-SQLAlchemy的
join
方法的onclause
paremeter显式地实现这一点。onclause
参数的用法与SQL的连接类似,例如
sqlalchemy.orm.join(table1, table2, onclause=table2.ID == table1.your_attribute)
您也可以通过简单地在类中声明外键来绕过数据库中外键的存在:
Column('ID', Integer, ForeighKey('table1.your_attribute'))
虽然可以在@mpolednik提到的查询中这样做,但如果我正确阅读了您的问题,理想的解决方案是在类中声明关系以供重复使用 只需预先声明要使用的类即可实现,如下所示:
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session, relationship
from sqlalchemy import create_engine, Column, String
Base = automap_base()
engine = create_engine("postgresql://user:pass@localhost:5432/mydb")
# pre-declare User for the 'user' table
class User(Base):
__tablename__ = 'user'
# override schema elements like Columns
oname = Column('originalname', String)
# and a relationship. I name it 'weird' because in my database schema
# this relationship makes absolutely no sense, but it does demonstrate
# the point
weird = relationship("usergroup",
foreign_keys='usergroup.id',
primaryjoin='and_(usergroup.id==User.id)')
Base.prepare(engine, reflect=True)
session = Session(engine)
# Test this by querying the User table and then following the relationship
u = session.query(User).filter(User.oname == 'testuser').one()
print (u.oname)
for g in u1.weird:
print g.name
有关文档(包括另一个示例),请参见此处: