python - SQLAlchemy 可以自动从数据库模式创建关系吗?

标签 python sqlite sqlalchemy relationship foreign-key-relationship

从现有的(SQLite)外键数据库开始,SQLAlchemy能否自动构建relationships

SQLAlchemy 类通过 __table_args__ = {'autoload': True} 自动创建。

目标是轻松访问相关表中的数据,而无需手动添加所有关系(即不使用 sqlalchemy.orm.relationship()sqlalchemy。 orm.backref).

最佳答案

[更新] 从 SQLAlchemy 0.9.1 开始有 Automap extension因为这样做。

对于 SQLAlchemy < 0.9.0,可以使用 sqlalchemy 反射。

SQLAlchemy 反射加载表之间的外键/主键关系。但不创建映射类之间的关系。实际上反射不会为您创建映射类 - 您必须指定映射类名称。

其实我认为加载外键的反射支持是一个很好的 helper 和节省时间的工具。使用它,您可以使用连接构建查询,而无需指定用于连接的列。

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

此外,当我使用反射对现有数据库运行查询时 - 我必须只定义映射类名称、表绑定(bind)、关系,但不需要为这些关系定义表列。

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 反射已经是一个强大的工具,可以节省我的时间,所以手动添加关系对我来说是一个很小的开销。

如果我必须开发使用现有外键在映射对象之间添加关系的功能,我将从使用 reflection with inspector 开始.使用 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']}]

关于python - SQLAlchemy 可以自动从数据库模式创建关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14398329/

相关文章:

python - 忽略正则表达式匹配中的换行符

python - python的vim设置

database - 我们如何保存在sqlite3中创建的数据库

android - 图片未正确保存到数据库中(作为 BLOB)

python - 在提交 SQLAlchemy 模型之前获取更改的值

python - 如何在相应索引中仅打印单词中猜测的字母?

Python Turtle Trouble - 循环结束太早

android - sqlite数据库不能使用cordova在一个表中插入两个以上的字段,

sqlalchemy - 如何使用 SqlAlchemy 和 pymssql 为 MS SQL 设置查询超时?

python-3.x - 在 Windows 上安装 psycopg2 时遇到问题