Python - SqlAlchemy. 如何关联不同模块或文件中的表?

3 投票
2 回答
3415 浏览
提问于 2025-04-16 01:59

我在一个文件里有一个类,另一个文件里有一个项目类,它们在同一个模块里。如果它们在不同的模块或文件中,当我定义一个新的Channel时,就会出现错误,因为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 个回答

1

"NoReferencedTableError: 找不到可以生成外键的 'items' 表"

你所有的表定义应该共享一个元数据对象。也就是说,你应该在一个单独的模块里写 metadata = rdb.MetaData(),然后在所有的 Table() 中使用这个 metadata 实例。

0

这个字符串的方法应该是可以用的,但如果不行的话,你也可以选择直接导入模块。

如果这样做出现了循环导入的问题,你仍然可以在创建类的实例之后再添加这个属性,像这样:

import item
Channel.items = relation(item.Item,
                         secondary=item.channel_items,
                         backref='channels')

撰写回答