Postgres SQLalchemy autop не распознает отношения - PullRequest
0 голосов
/ 11 июня 2018

Следуя примеру из документации 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

1 Ответ

0 голосов
/ 22 июня 2018

Поскольку таблицы можно идентифицировать без схемы, отмените ограничение, а затем используйте метаданные для автоматизации без декларативной базы.

Вот ссылки на соответствующую документацию по sqlalchemy:

  1. create_engine
  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 в большинстве редакторов, а этот метод - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...