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





