资讯专栏INFORMATION COLUMN

Essential SQLAlchemy2th学习笔记之反射Reflection

NSFish / 3098人阅读

摘要:基于反射对象进行查询模块反射这里我们不再使用而是使用扩展模块的获取所有的对象名获取表对象进行操作反射关联关系可以反射并建立表之间的但是建立关联列的命名为例如关于更多信息请详细参看官方文档

示例数据库下载:http://chinookdatabase.codepl...
在SQLALchemy中,我们使用反射技术来获取相关database schema信息,如tables,views,indexes等等

Core模块反射 反射单表
from sqlalchemy import MetaData, create_engine
metadata = MetaData()
engine = create_engine("sqlite:///Chinook_Sqlite.sqlite")
from sqlalchemy import Table
#这里我们并没有使用Column来定义列,而是使用autoload,autoload_with参数来从已有数据表中反射出相关列定义。
artist = Table("Artist", metadata, autoload=True, autoload_with=engine)
#接下来使用反射出来的表对象进行相关查询
artist.columns.keys() #列出所有的列名
from sqlalchemy import select
s = select([artist]).limit(10)
engine.execute(s).fetchall()
#metadata.tables["Artist"]
#artist.foreign_keys
#from sqlalchemy import ForeignKeyConstraint
#album.append_constraint(ForeignKeyConstraint(["ArtistId"], ["artist.ArtistId"]))
#str(artist.join(album))
反射整个数据库
#使用reflect()方法,它不会返回任何值
metadata.reflect(bind=engine)
#但是我们仍然可以进行相关检索
metadata.tables.keys() #获取所有的表名

注意:从SQLAlchemy1.0版本开始,我们不能通过反射获取CheckConstraints, comments, or triggers.You also can’t reflect client-side defaults or an association between a sequence and a column.(这意味着我们会失去注释,或者表关联关系)但是我们可以通过相关方法或函数手动添加它们。

基于反射对象进行查询
playlist = metadata.tables["Playlist"]
from sqlalchemy import select
s = select([playlist]).limit(10)
engine.execute(s).fetchall()
ORM模块反射 Reflecting a Database with Automap

这里我们不再使用declarative_base而是使用扩展模块的automap_base

from sqlalchemy.ext.automap import automap_base
Base = automap_base()
from sqlalchemy import create_engine
engine = create_engine("sqlite:///Chinook_Sqlite.sqlite")
Base.prepare(engine, reflect=True)
Base.classes.keys() #获取所有的对象名
#获取表对象
Artist = Base.classes.Artist
Album = Base.classes.Album

#进行操作
from sqlalchemy.orm import Session
session = Session(engine)
for artist in session.query(Artist).limit(10):
    print(artist.ArtistId, artist.Name)
Reflected Relationships反射关联关系

Automap可以反射并建立表之间的many-to-one, one-to-many, and many-to-many relationships.
但是建立关联列的命名为< related_object>_collection例如:

artist = session.query(Artist).first()
for album in artist.album_collection:
    print("{} - {}".format(artist.Name, album.Title))

关于Automap更多信息请详细参看官方文档

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38264.html

相关文章

  • Essential SQLAlchemy2th学习笔记自动生成代码

    摘要:支持从现有数据库自动生成代码,并支持一对多,一对一,多对多的关联关系。生成整个库的代码指定表保存到指定文件 pip install sqlacodegen sqlacodegen支持从现有数据库自动生成ORM代码,并支持一对多,一对一,多对多的关联关系。 #生成整个库的代码 sqlacodegen sqlite:///Chinook_Sqlite.sqlite #指定表 sqlacod...

    Sleepy 评论0 收藏0
  • Essential SQLAlchemy2th学习笔记Alembic数据库迁移

    摘要:默认的可以增量式创建数据库缺失的表,但是无法做到修改已有的表结构,或删除代码中已经移除的表。这个时候我们就需要用到这个库。 SQLAlchemy默认的create_all()可以增量式创建数据库缺失的表,但是无法做到修改已有的表结构,或删除代码中已经移除的表。这个时候我们就需要用到Alembic这个SQLAlchemy migrations库。安装:pip install alembi...

    cartoon 评论0 收藏0
  • Essential SQLAlchemy2th学习笔记ORM模块

    摘要:你应该使用工厂类来创建类,因为这确保了配置参数的正确性。对象包含创建数据库连接所需的一切信息,它不会立即创建连接对象,而是会在我们进行具体操作时创建。注意生产环境不要使用这个选项。关于选择的最佳实践使用迭代方式获取所有值,而不是。 定义模式Defining Schema 定义ORM类的4个步骤: 继承declarative_base()函数返回的类 定义__tablename__属性...

    JasonZhang 评论0 收藏0
  • Laravel学习笔记PHP反射(Reflection) (上)

    摘要:说明中经常使用的反射特性来设计代码,本文主要学习的反射特性,来提高写代码时的设计质量。提供一套检测的两个工具包和,类似于探针一样的东西来探测这些一等公民。限于篇幅,下篇再聊下反射。 说明:Laravel中经常使用PHP的反射特性来设计代码,本文主要学习PHP的反射特性,来提高写代码时的设计质量。PHP提供一套检测class, interface, trait, property, me...

    JessYanCoding 评论0 收藏0
  • 《深入理解ES6》笔记——代理(Proxy)和反射Reflection)API(12)

    摘要:方法与代理处理程序的方法相同。使用给目标函数传入指定的参数。当然,不用反射也可以读取的值。的例子我们可以理解成是拦截了方法,然后传入参数,将返回值赋值给,这样我们就能在需要读取这个返回值的时候调用。这种代理模式和的代理有异曲同工之妙。 反射 Reflect 当你见到一个新的API,不明白的时候,就在浏览器打印出来看看它的样子。 showImg(https://segmentfault....

    ZHAO_ 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<