【问题标题】:Why am I getting SQLAlchemy Error "__table_args__ value must be a tuple, dict, or None"为什么我收到 SQLAlchemy 错误“__table_args__ 值必须是元组、字典或无”
【发布时间】:2016-11-10 07:08:21
【问题描述】:

我有以下 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))

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

     __table_args__ = db.UniqueConstraint('b_id', 'e_id', name='unique_constraint_bid_eid')

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

sqlalchemy.exc.ArgumentError: __table_args__ value must be a tuple, dict, or None

为什么会出现此错误?我该如何解决?我尝试将等式的右边放在括号中,但这并没有解决问题。

【问题讨论】:

  • 试试__table_args__ = (db.UniqueConstraint('b_id', 'e_id', name='unique_constraint_bid_eid'), )

标签: python sqlalchemy flask-sqlalchemy sqlalchemy-migrate


【解决方案1】:
正如错误代码所示,

table_args 应该是元组、字典或 None。如果你把它变成一个元组,那么你必须把你的值放在括号中,最后还要有一个逗号:

尝试:

     __table_args__ = (db.UniqueConstraint('b_id', 'e_id', name='unique_constraint_bid_eid'), )

【讨论】:

  • 哇,最后一个逗号很关键,有人知道为什么吗?
  • 没有逗号,Python 将括号解释为不是元组构造函数,而是解释为常规括号。 stackoverflow.com/questions/7992559/…
【解决方案2】:

参考这个Table Configuration

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

class MyClass(Base):
    __tablename__ = 'sometable'
    __table_args__ = {'mysql_engine':'InnoDB'}
    enter code here

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

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

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

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


【讨论】:

    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2019-05-23
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多