sqlalchemy 10 ORM 反射

本文介绍如何使用SQLAlchemy的Automap功能进行数据库反射,包括设置环境、反射数据库结构及使用ORM对象进行数据查询。文章还展示了如何通过正向和反向关系查询相关联的数据。

Core的反射用metadata,ORM的反射用到automap。

数据库用的是案例给的Chinook_Sqlite.sqlite。

反射数据库 需要 atuomap_base引擎连接到想反射的数据库。c10_.py

from sqlalchemy.ext.automap import automap_base
Base = automap_base()    #初始化automap

from sqlalchemy import create_engine
engine = create_engine('sqlite:///Chinook_Sqlite.sqlite')    #engine

Base.prepare(engine, reflect=True)  #反射引擎上的所有内容,并为每个表创建了ORM对象。

print(Base.classes.keys())    #访问这些对象
输出:
['Album', 'Artist', 'Customer', 'Employee', 'Genre', 'Invoice', 'InvoiceLine', 'Track', 'MediaType', 'Playlist']

引用库里的两个ORM对象。

artist = Base.classes.Artist
album = Base.classes.Album

书上没讲怎么看属性。可以用help(),得知artist有两列。

#print(help(artist))
print(artist.__dict__)
#输出
'''
{'__table__': Table('Artist', MetaData(bind=None), Column('ArtistId', INTEGER(), table=<Artist>, primary_key=True, nullable=False), Column('Name', NVARCHAR(length=120), table=<Artist>), schema=None),
 '__module__': 'sqlalchemy.ext.automap', 
'__doc__': None, 
'_sa_class_manager': <ClassManager of <class 'sqlalchemy.ext.automap.Artist'> at 2d8aa7d5af0>,
'__init__': <function __init__ at 0x000002D8AA7DA488>,
'ArtistId': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x000002D8AA7D5BA0>,
'Name': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x000002D8AA7D5BF8>, 
'__mapper__': <Mapper at 0x2d8aa786b00; Artist>}
'''

使用query。

from sqlalchemy.orm import Session
session = Session(engine)
for art in session.query(artist).limit(10):
    print(art.ArtistId, art.Name)

反射关系

用上面__dict__可以看出一个表的结构属性,包括ForeignKey,但是却看不出backref。

automap提供 <related_object>_collection 属性作为backref,帮助我们从一段关系中,反向寻找对象。(正向的直接用有ForeignKey那列就行了)

应该是我想的这样的。

print(album.__dict__)
#输出
'''
{'__table__': Table('Album', MetaData(bind=None), 
Column('AlbumId', INTEGER(), table=<Album>, primary_key=True, nullable=False), 
Column('Title', NVARCHAR(length=160), table=<Album>, nullable=False), 
Column('ArtistId', INTEGER(), ForeignKey('Artist.ArtistId'), table=<Album>, nullable=False), schema=None), 
#.....
'''
#正向,用album的ForeignKey找artist
from sqlalchemy.orm import Session
session = Session(engine)
a = session.query(album).limit(10)
for aa in a:
    #print(aa.ArtistId)
    t = session.query(artist).filter(artist.ArtistId == aa.ArtistId).first()    #这里我在想有没有更好的办法,不使用这个session.query
    print(aa.ArtistId,'-',t.Name)
#反向,用 <related_object>_collection
from sqlalchemy.orm import Session
session = Session(engine)
art = session.query(artist).first()
for al in art.album_collection:
    print(art.Name, '-', al.Title)

 

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值