只能通过关联表对象定义二级关系,不能直接使用名称

1 投票
1 回答
1058 浏览
提问于 2025-04-18 03:26

我想在Note和Document这两个类之间建立一种关联关系。现在遇到的问题是,我的第二个关系只有在使用关联表对象时才有效,而不是使用表名。也就是说,下面的关系:

notes = relationship(u'Note', secondary=t_Documented, backref='documents')

可以正常工作,但以下的却不行:

notes = relationship(u'Note', secondary='Documented', backref='documents')

在查询时,我遇到了这个错误:

sqlalchemy.exc.InvalidRequestError: 在初始化映射器时,Mapper|Document|Document,表达式'Documented'未能找到名称("name 'Documented' is not defined")。如果这是一个类名,请考虑在定义完这两个依赖类后再将这个relationship()添加到类中。

我更希望使用名称,因为我的模型是通过sqlacodegen生成的。

此外,SQLAlchemy的文档说我可以使用名称(http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#many-to-many),但有个注意事项是“在使用声明扩展时”。我在谷歌上搜索了这个术语,找到了这个。我的问题是,在我的情况下,如何增强Base。

# model.py
# coding: utf-8
from sqlalchemy import Column, Date, DateTime, ForeignKey, ForeignKeyConstraint, Index, Integer, Numeric, String, Table, Text, text
from sqlalchemy.orm import backref, relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
metadata = Base.metadata

t_Documented = Table(
    'Documented', metadata,
    Column('id', Integer, primary_key=True),
    Column('note_id', ForeignKey(u'MySchema.Note.id'), nullable=False),
    Column('document_id', ForeignKey(u'MySchema.Document.id'), nullable=False, index=True),
    Column('inserted', DateTime, nullable=False, server_default=text("'0000-00-00 00:00:00'")),
    Column('updated', DateTime, nullable=False, server_default=text("'0000-00-00 00:00:00'")),
    Index('Documented_AK1', 'note_id', 'document_id'),
    schema='MySchema'
)

class Note(Base):
    __tablename__ = 'Note'
    __table_args__ = {u'schema': 'MySchema'}

    id = Column(Integer, primary_key=True)

class Document(Note):
    __tablename__ = 'Document'
    __table_args__ = {u'schema': 'MySchema'}

    id = Column(ForeignKey(u'MySchema.Note.id'), primary_key=True)
    title = Column(String(100), nullable=False)
    author = Column(String(100), nullable=False)

    notes = relationship(u'Note', secondary='Documented', backref='documents')

我使用的是SQLAlchemy 0.9.4和Python 2.6.6,连接器是MySQLDB,数据库是MySQL。

1 个回答

5

你的表格有一个叫做"MySchema"的结构,所以这个名字必须包含在里面:

notes = relationship(u'Note', secondary='MySchema.Documented', backref='documents')

撰写回答