为什么我得到SQLAlchemy错误"__table_args__值必须是元组,字典或无"

Saq*_*Ali 4 python sqlalchemy sqlalchemy-migrate flask-sqlalchemy

我有以下SQLAlchemy模型.它已成功迁移到数据库:

class MyClassA(db.Model, Timestamp):
    a_id = db.Column(db.Integer, nullable=False, primary_key=True)
    b_id = db.Column(db.Integer, db.ForeignKey(C.c_id), nullable=False)
    d = db.Column(db.String(1024))
    e_id = db.Column(db.Integer,
                      db.ForeignKey(e.e_id))
Run Code Online (Sandbox Code Playgroud)

现在我想在第二和第四个字段中添加唯一性约束.所以我将以下行添加到模型中:

     __table_args__ = db.UniqueConstraint('b_id', 'e_id', name='unique_constraint_bid_eid')
Run Code Online (Sandbox Code Playgroud)

但是现在当我尝试迁移它时,我收到以下错误:

sqlalchemy.exc.ArgumentError: __table_args__ value must be a tuple, dict, or None
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?我该如何解决?我尝试将等式的右侧放在括号中,但这并没有解决它.

Jef*_*ell 7

table_args应该是错误代码建议的元组,字典或无.如果你把它作为一个元组,那么你必须将你的值放在括号中,并在最后有一个逗号:

尝试:

     __table_args__ = (db.UniqueConstraint('b_id', 'e_id', name='unique_constraint_bid_eid'), )
Run Code Online (Sandbox Code Playgroud)

  • 如果没有逗号,Python 不会将括号解释为元组构造函数,而只是将其解释为常规括号。/sf/ask/559479161/ (2认同)

Nic*_*ing 6

请参阅此表配置

使用table_args类属性指定名称、元数据和映射列参数以外的表参数。此属性包含通常发送到 Table 构造函数的位置参数和关键字参数。可以以两种形式之一指定该属性。一个是作为字典:

class MyClass(Base):
    __tablename__ = 'sometable'
    __table_args__ = {'mysql_engine':'InnoDB'}
    enter code here
Run Code Online (Sandbox Code Playgroud)

另一个,一个元组,其中每个参数都是位置(通常是约束):

class MyClass(Base):
    __tablename__ = 'sometable'
    __table_args__ = (
            ForeignKeyConstraint(['id'], ['remote_table.id']),
            UniqueConstraint('foo'),
            )

Run Code Online (Sandbox Code Playgroud)

通过将最后一个参数指定为字典,可以使用上述形式指定关键字参数:

class MyClass(Base):
    __tablename__ = 'sometable'
    __table_args__ = (
            ForeignKeyConstraint(['id'], ['remote_table.id']),
            UniqueConstraint('foo'),
            {'autoload':True}
            )


Run Code Online (Sandbox Code Playgroud)