根据sqlalchemy documentation and adapting的示例,我已经为我的数据库获取了此代码:
from sqlalchemy.ext.automap import automap_base
from sqlalchemy import create_engine, MetaData
engine = create_engine('postgresql://u:pw@db')
metadata = MetaData(schema='name')
metadata.reflect(engine, only=['a', 'b'])
Base = automap_base(bind=engine, metadata=metadata)
Base.prepare()
A, B = Base.classes.a, Base.classes.b
result = A.first()
print(result.id)
运行脚本会返回以下错误:
File "/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File "/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "/Users/<User>/untitled0.py", line 18, in <module>
Base.prepare(engine,reflect=True)
File "/anaconda3/lib/python3.6/site-packages/sqlalchemy/ext/automap.py", line 788, in prepare
generate_relationship)
File "/anaconda3/lib/python3.6/site-packages/sqlalchemy/ext/automap.py", line 895, in _relationships_for_fks
local_cls, referred_cls):
TypeError: issubclass() arg 2 must be a class or tuple of classes
答案 0 :(得分:0)
由于可以在没有模式的情况下识别表,因此消除了限制,然后使用元数据在没有声明性基础的情况下自动映射。
以下是相关sqlalchemy文档的链接:
from sqlalchemy import create_engine, MetaData, Table, select
engine = create_engine('postgresql://u:pw@db')
metadata = MetaData(engine)
a = Table('a', metadata, autoload=True, autoload_with=engine)
b = Table('b', metadata, autoload=True, autoload_with=engine)
ab = a.join(b)
query = select([a.c.id,b.c.id]).select_from(ab)
result = conn.execute(query).fetchone()
运行此脚本将返回表a中的第一条记录和表b中的第一条连接记录。
请注意,此格式完全取决于两个表之间具有外键连接的数据库。另外,使用这些类将为您提供大多数编辑器中table.fields的代码完成,而该方法则不能。