gpt4 book ai didi

python - 为什么 UniqueConstraint 在 flask_sqlalchemy 中不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:54 26 4
gpt4 key购买 nike

我想要在 Flask 中替代 Django 的 unique_together,似乎 UniqueConstraint 是我正在寻找的,但对我不起作用。

例子如下:

import os
from flask import Flask
from flask_script import Manager, Shell
from flask_sqlalchemy import SQLAlchemy

basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

manager = Manager(app)
db = SQLAlchemy(app)

class User(db.Model):
__tablename__ = 'users'
__table_args__ = tuple(db.UniqueConstraint('name', 'address'))
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), nullable=False)
address = db.Column(db.String(64), nullable=False)

def __repr__(self):
return '<User (%s, %s)>' % (self.name, self.address)


def make_shell_context():
return dict(app=app, db=db, user=User)
manager.add_command("shell", Shell(make_context=make_shell_context))


if __name__ == '__main__':
manager.run()

测试它:

$ python test.py shell

In [1]: db.create_all()

In [2]: u1=user(name='a', address='x'); u2=user(name='a', address='x');
db.session.add(u1); db.session.add(u2); db.session.commit()

In [3]: user.query.all()
Out[3]: [<User (a, x)>, <User (a, x)>]

我也尝试过:

class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), nullable=False)
address = db.Column(db.String(64), nullable=False)
db.UniqueConstraint('name', 'address')

也不行,有什么问题吗?

最佳答案

UniqueConstraint 的实例是可迭代的,在这种情况下似乎会立即停止迭代,所以

tuple(db.UniqueConstraint('name', 'address'))

当您想要一个包含 1 个项目的元组时,会产生一个空元组,即约束实例。使用

__table_args__ = (db.UniqueConstraint('name', 'address'), )

或任何其他变体。至于后一种形式为什么不行,你must apply table-level constraint objects using __table_args__在声明中,如果使用 names,或者在约束构造和支持声明模型的 Table 之间将没有连接。如果使用 Column 对象,则几乎可以在任何地方创建约束,连接是通过 Column 对象与 Table 建立的。还有第三种选择:Table.append_constraint()方法,您可以通过模型类的 __table__ 属性访问它。

关于python - 为什么 UniqueConstraint 在 flask_sqlalchemy 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com