[英]How to automatically generate sqlalchemy relationships on set and create?
[英]Can SQLAlchemy automatically create relationships from a database schema?
从具有外键的现有(SQLite)数据库开始,SQLAlchemy可以自动建立关系吗?
SQLAlchemy类是通过__table_args__ = {'autoload': True}
自动创建的。
目标是轻松访问相关表中的数据,而无需手动逐个添加所有关系(即不使用sqlalchemy.orm.relationship()
和sqlalchemy.orm.backref
)。
[更新]从SQLAlchemy 0.9.1开始,有一个Automap扩展用于执行此操作。
对于SQLAlchemy <0.9.0,可以使用sqlalchemy反射。
SQLAlchemy反射加载表之间的外键/主键关系。 但是不会在映射的类之间创建关系。 实际上,反射不会为您创建映射类 - 您必须指定映射的类名。
实际上我认为加载外键的反射支持是一个很好的帮手和节省时间的工具。 使用它可以使用连接构建查询,而无需指定要用于连接的列。
from sqlalchemy import *
from sqlalchemy import create_engine, orm
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
metadata = MetaData()
Base = declarative_base()
Base.metadata = metadata
db = create_engine('<db connection URL>',echo=False)
metadata.reflect(bind=db)
cause_code_table = metadata.tables['cause_code']
ndticket_table = metadata.tables['ndticket']
sm = orm.sessionmaker(bind=db, autoflush=True, autocommit=True, expire_on_commit=True)
session = orm.scoped_session(sm)
q = session.query(ndticket_table,cause_code_table).join(cause_code_table)
for r in q.limit(10):
print r
此外,当我使用反射来运行对现有数据库的查询时 - 我只需要定义映射的类名,表绑定,关系,但是不需要为这些关系定义表列。
class CauseCode(Base):
__tablename__ = "cause_code"
class NDTicket(Base):
__tablename__ = "ndticket"
cause_code = relationship("CauseCode", backref = "ndticket")
q = session.query(NDTicket)
for r in q.limit(10):
print r.ticket_id, r.cause_code.cause_code
整体SQLAlchemy反射已经是强大的工具并节省了我的时间,因此手动添加关系对我来说是一个小开销。
如果我必须开发将使用现有外键在映射对象之间添加关系的功能,我将从使用检查器的反射开始。 使用get_foreign_keys()方法提供构建关系所需的所有信息 - 在目标表中引用的表名,引用的列名和列名。 并将使用此信息将属性与关系添加到映射类中。
insp = reflection.Inspector.from_engine(db)
print insp.get_table_names()
print insp.get_foreign_keys(NDTicket.__tablename__)
>>>[{'referred_table': u'cause_code', 'referred_columns': [u'cause_code'], 'referred_schema': None, 'name': u'SYS_C00135367', 'constrained_columns': [u'cause_code_id']}]
从SQLAlchemy 0.9.1开始,(现在是实验性的)Automap扩展似乎就是这样做的: http : //docs.sqlalchemy.org/en/rel_0_9/orm/extensions/automap.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.