首页 > 解决方案 > 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

标签: python-3.xpostgresqlsqlalchemy

解决方案


由于可以在没有模式的情况下识别表,因此消除限制然后使用元数据在没有声明性基础的情况下进行自动映射。

以下是相关 sqlalchemy 文档的链接:

  1. 创建引擎

  2. 元数据

  3. 桌子

  4. 选择

    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 提供代码完成,而此方法不会。


推荐阅读