Postgres SQLalchemy自动化无法识别关系

时间:2018-06-11 18:06:40

标签: python-3.x postgresql sqlalchemy

根据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

1 个答案:

答案 0 :(得分:0)

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

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

  1. create_engine
  2. MetaData
  3. Table
  4. select

    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的代码完成,而该方法则不能。