栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

[更新] 从SQLAlchemy
0.9.1开始,有用于此操作的Automap扩展。

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

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

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

from sqlalchemy import *from sqlalchemy import create_engine, ormfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import relationshipmetadata = metaData()base = declarative_base()base.metadata = metadatadb = create_engine('<db connection URL>',echo=False)metadata.reflect(bind=db)cause_pre_table = metadata.tables['cause_pre']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_pre_table).join(cause_pre_table)for r in q.limit(10):    print r

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

class CauseCode(base):    __tablename__ = "cause_pre"class NDTicket(base):    __tablename__ = "ndticket"    cause_pre = relationship("CauseCode", backref = "ndticket")q = session.query(NDTicket)for r in q.limit(10):    print r.ticket_id, r.cause_pre.cause_pre

总体而言,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_pre', 'referred_columns': [u'cause_pre'], 'referred_schema': None, 'name': u'SYS_C00135367', 'constrained_columns': [u'cause_pre_id']}]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/668178.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号