【问题标题】:Python - SqlAlchemy. How to relate tables from different modules or files?Python - SqlAlchemy。如何关联来自不同模块或文件的表?
【发布时间】:2010-07-28 21:50:44
【问题描述】:

我在同一个模块的一个文件中有这个类,在另一个文件中有项目类。如果在我定义新 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))

提前致谢!

【问题讨论】:

  • re: "in another file in the same module": 我认为 Python 模块 一个文件(另见docs.python.org/tutorial/modules.html);你的意思是“包”而不是“模块”? (只是检查一下,这让我有些困惑......)

标签: python sqlalchemy


【解决方案1】:

字符串方法应该可以工作,但如果不行,也可以选择简单地导入模块。

如果这给了你导入循环,那么你仍然可以在实例化类之后添加属性,如下所示:

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

【讨论】:

  • 我已经试过了。我不知道发生了什么事。如果我尝试您所说的,这是错误:“NoReferencedTableError:找不到用于生成外键的表'项目'”至少这是不同的错误,如果可以找到类,因为表的名称是项目(类物品)。所以我想我错过了一些东西谢谢!
  • 不幸的是我对rdb不太熟悉。我知道这适用于普通的 SQLAlchemy 类。也许您仍然缺少导入以便它可以找到其他类?尝试从ChannelTest.py 导入Item.py,反之亦然。那可能会解决它;)
【解决方案2】:

“NoReferencedTableError: 找不到用于生成外键的表‘项目’”

您的所有表定义都应该共享元数据对象。 所以你应该在某个单独的模块中执行metadata = rdb.MetaData(),然后在所有Table() 中使用这个metadata 实例。

【讨论】:

    猜你喜欢
    • 2014-01-19
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    相关资源
    最近更新 更多