В sqlalchemy, как я могу использовать полиморфное присоединенное наследование таблицы, когда дочерняя таблица имеет несколько внешних ключей к родительской таблице?

У меня есть родительская таблица с именем pbx_point которая имеет столбец point_type . У меня также есть pbx_route таблица pbx_route с столбцом point_id указывающим на pbx_point .

Я хотел бы использовать объединенное наследование таблицы sqlalchemy, чтобы связать эти две таблицы с помощью декларативной базы и использовать полиморфное наследование

Это работает отлично – точнее, если бы не следующее дополнительное ограничение: pbx_point также имеет внешний ключ с именем initial_route_id указывающий на pbx_route .

Я также использую отражение ниже, но db, как я описал выше. Ошибка, которую я получаю, это sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly. sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly. ,

Это имеет смысл, поскольку «за кулисами» делкаративная база создает атрибут relationship () для обоих сопоставленных классов. Я хотел бы, чтобы он выбирал pbx_route.point_id как ссылку parent_id, но также видит столбец pbx_point.initial_route_id . Это было бы просто исправить, если я создавал это отношение (), но я не являюсь – системой декларативного наследования.

Есть ли дополнительный аргумент, который я могу передать __mapper_args__ , например polymorphic_parent_col который позволит мне указать внешний ключ, который я желаю? Если нет, как я могу обойти эту проблему?

Благодарю.

 class MyBase(DeferredReflection): @declared_attr def __tablename__(cls): return cls.__name__.lower() Base = declarative_base(cls=MyBase) class pbx_point(Base): __mapper_args__ = dict( polymorphic_on='point_type', with_polymorphic='*', ) class pbx_route(pbx_point): __mapper_args__ = dict(polymorphic_identity='pbx.route') 

Это трассировка стека, которую я получаю:

 Traceback (most recent call last): File "db.py", line 50, in <module> Base.prepare(engine) File "env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/api.py", line 431, in prepare thingy.map() File "env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 379, in map **mapper_args File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/__init__.py", line 1147, in mapper return Mapper(class_, local_table, *args, **params) File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 213, in __init__ self._configure_inheritance() File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 517, in _configure_inheritance self.local_table) File "env/local/lib/python2.7/site-packages/sqlalchemy/sql/util.py", line 397, in join_condition "join explicitly." % (a.description, b.description)) sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly. 

Указывает, что он умирает по адресу https://bitbucket.org/sqlalchemy/sqlalchemy/src/7f3494ebad58/lib/sqlalchemy/orm/mapper.py?at=default#cl-517 . Несколько строк выше, что делает ссылку на mapper kwarg inherit_condition , которая, кажется, нужна мне.

One Solution collect form web for “В sqlalchemy, как я могу использовать полиморфное присоединенное наследование таблицы, когда дочерняя таблица имеет несколько внешних ключей к родительской таблице?”

Ключ – это аргумент inherit_condition для inherit_condition . Полиморфная информация на самом деле не имеет ничего общего с этим шагом.

Исправленные модели:

 class MyBase(DeferredReflection): @declared_attr def __tablename__(cls): return cls.__name__.lower() Base = declarative_base(cls=MyBase) class pbx_point(Base): __mapper_args__ = dict( polymorphic_on='point_type', with_polymorphic='*', ) id = Column(Integer, primary_key=True) class pbx_route(pbx_point): point_id = Column(Integer, ForeignKey(pbx_point.id)) __mapper_args__ = dict( polymorphic_identity='pbx.route', inherit_condition=(point_id == pbx_point.id) ) 

Мне нужно было добавить столбцы id и point_id чтобы использовать их в аргументе inherit_condition . Вероятно, есть способ сделать это, только используя рефлексию, но это не страшное препятствие.

  • SQLAlchemy - обновление ForeignKey при настройке отношения
  • Уровень изоляции с помощью Flask-SQLAlchemy
  • Повесьте скрипт Python с помощью SQLAlchemy и многопроцессорности
  • UnicodeEncodeError: кодек «latin-1» не может кодировать символы в позиции 0-1: порядковый номер не в диапазоне (256)
  • Ошибка при выполнении миграции: sqlalchemy.exc.CompileError: Тип Postgresql ENUM требует имени
  • TypeError: объект BaseQuery не может быть вызван.
  • Ожидание обновления строки или вставки строки с sqlalchemy
  • Правильный способ предотвратить повторение запросов SQLAlchemy на истекших объектах?
  •  
    Interesting Posts for Van-Lav

    Различия в методах класса в Python: связанные, несвязанные и статические

    Отправка команд DDC / CI для мониторинга в Windows с использованием Python?

    HTTPSConnectionPool (host = 's3-us-west-1b.amazonaws.com', порт = 443): Максимальное количество попыток превышено с помощью URL-адреса

    глубокое копирование генератора в python

    Добавление папки на путь Python навсегда

    Вычитание 2 списков в Python

    Является ли os.path.expanduser ("~ / x") эквивалентным os.path.abspath (os.path.expanduser ("~ / x"))?

    Альтернатива Python для вычисления попарного расстояния между двумя наборами 2d точек

    Разница в дескрипторе hog, рассчитанная на цветные изображения в Python и C ++

    Python regex \ w не соответствует сочетанию диакритики?

    Запоминающая библиотека Python в памяти

    Зачем мне нужно __declspec (dllexport), чтобы сделать некоторые функции доступными из ctypes?

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

    Переупорядочение массива 4d numpy

    как создавать случайные случайные ациклические ориентированные графы с отрицательными весами в python

    Python - лучший язык программирования в мире.