Python - SqlAlchemy. Как связать таблицы из разных модулей или файлов? - PullRequest
2 голосов
/ 29 июля 2010

У меня есть этот класс в одном файле и класс элемента в другом файле в том же модуле.Если они находятся в разных модулях или файлах, когда я определяю новый канал, я получаю сообщение об ошибке, потому что Item не находится в том же файле.Как я могу решить эту проблему?Если оба класса находятся в одном файле, я не получаю никакой ошибки.

ChannelTest.py

from ItemTest import Item

metadata = rdb.MetaData()

channel_items = Table(
        "channel_items",
        metadata,
        Column("channel_id", Integer,
            ForeignKey("channels.id")),
        Column("item_id", Integer,
            ForeignKey("items.id"))
    )

class Channel(rdb.Model):
    """ Set up channels table in the database """
    rdb.metadata(metadata)
    rdb.tablename("channels")

    id = Column("id", Integer, primary_key=True)
    title = Column("title", String(100))

    items = relation("Item",
                secondary=channel_items, backref="channels")

Item.py Другой файл, но в одном модуле

class Item(rdb.Model):
    """ Set up items table in the database """
    rdb.metadata(metadata)
    rdb.tablename("items")

    id = Column("id", Integer, primary_key=True)
    title = Column("title", String(100))

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 31 июля 2010

"NoReferencedTableError: Не удалось найти« элементы »таблицы, с помощью которых можно сгенерировать внешний ключ» *

Все ваши определения таблиц должны совместно использовать объект метаданных. Таким образом, вы должны сделать metadata = rdb.MetaData() в каком-то отдельном модуле, а затем использовать этот экземпляр metadata во всех Table().

0 голосов
/ 29 июля 2010

Строковый метод должен работать, но если это не так, есть также опция простого импорта модуля.

И если это дает вам циклы импорта, вы все равно можете добавить свойство после создания экземпляра класса следующим образом:

import item
Channel.items = relation(item.Item,
                         secondary=item.channel_items,
                         backref='channels')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...