python-3.x - Postgres SQLalchemy 自动映射无法识别关系
问题描述
按照sqlalchemy文档和适应中的示例,我为我的数据库获取了以下代码:
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
解决方案
由于可以在没有模式的情况下识别表,因此消除限制然后使用元数据在没有声明性基础的情况下进行自动映射。
以下是相关 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 提供代码完成,而此方法不会。
推荐阅读
- variables - 如何扩展符号系列
- localization - 本地化 PWA Web 清单
- javascript - 如何使用 JavaScript 从某些 html 标签中删除文本
- java - 为了确保显示使用 BroadcastReceiver 创建的活动,应该使用 PowerManager 唤醒设备多长时间?
- swift - 在快照侦听器中添加一个新文档时,Firestore 文档读取成本
- javascript - 包含多个条件的Javascript查找失败
- swift - Swift:将类的 ObjectID 用于可散列协议会导致 set.contains 方法中的随机行为。代码有什么问题?
- javascript - jQuery .get() 不向服务器发送请求
- node.js - express node js如何在mongodb中将图像保存为二进制并显示在屏幕上
- reactjs - 在某些路线上隐藏布局