我希望模型的主键是一个自动递增的整数。
class Region(db.Model):
__tablename__ = 'regions'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100))
parent_id = db.Column(db.Integer, db.ForeignKey('regions.id'))
parent = db.relationship('Region', remote_side=id, primaryjoin=('Region.parent_id==Region.id'), backref='sub-regions')
created_at = db.Column(db.DateTime, default=db.func.now())
deleted_at = db.Column(db.DateTime)
上面的代码创建了我的表,但没有使id
自动递增。
错误:列“id”中的空值违反了非空约束条件
因此我将id
声明更改为如下形式
id = db.Column(db.Integer, db.Sequence('seq_reg_id', start=1, increment=1),
primary_key=True)
仍然是同样的错误。上面的代码有什么问题?
9条答案
按热度按时间31moq8wy1#
上面的代码没有任何问题。实际上,您甚至不需要
autoincrement=True
或db.Sequence('seq_reg_id', start=1, increment=1),
,因为SQLAlchemy会自动将第一个没有标记为FK的Integer
PK列设置为autoincrement=True
。在这里,我已经根据您的设置整理了一个工作设置。SQLAlechemy的ORM将负责生成id并用它们填充对象 *,如果您使用基于声明性Base的类 * 来创建对象的示例的话。
eanckbw92#
我遇到了一个问题,我的SQLite表不能自动递增主键。我有一个稍微复杂的用例,我想在生产中使用postgres,但在测试中使用sqlite,以便在连续部署时更轻松一些。
事实证明SQLite不喜欢将列定义为BigIntegers,为了使增量工作,应该将它们设置为Integers。值得注意的是,SQLAlchemy可以使用with_variant函数处理这种情况,如下所示。我认为这对某些人可能有用:
更多详细信息https://docs.sqlalchemy.org/en/13/dialects/sqlite.html
vm0i2vca3#
我认为设置后就不需要自动增量了,
我认为应该是这样,
它会给予你你所寻找的独特性。
g9icjywg4#
我在模型类上声明组合键时遇到了这个问题。
如果你想要一个组合键的自动递增的id字段(比如,超过1个
db.Column(..)
定义与primary_key=True
,然后添加autoincrement=True
为我解决了这个问题。因此,上面关于不需要
autoincrement=True
的陈述应该是:您甚至不需要
autoincrement=True
,因为SQLAlchemy会自动将第一个未标记为FK的Integer PK列设置为autoincrement=True
,除非您定义的组合键具有多个primary_key=True
vecaoik15#
默认情况下,即使没有设置autocrement =True标志,您的id也会自动递增。
所以使用
您得到的错误是由于试图用id属性填充表而导致的。您的插入查询在任何时候都不应该包含id属性,否则您将得到该错误。
wgx48brx6#
我有同样的错误,即使在添加
autoincrement=True
。问题是我已经创建了迁移。所以我降级到以前的迁移,删除迁移,再次创建迁移并升级。
然后错误就消失了。
希望能对被困在这上面的人有所帮助。
绕线:添加
autoincrement=True
,并确保更新并应用迁移。e4eetjau7#
不能在列定义中添加“自动增量”标志,而且不能在__table__name后面添加“__table__args”属性。如下所示:
试试吧,我希望这对你有用;)!
o4hqfura8#
在我的示例中,我只是将id作为外部参数添加,而不依赖于sqlalchemy
iyfjxgzm9#
试试这个代码,它对我很有效。
在
__init__
函数内不要指定id,所以当你创建一个新的“User”对象时SQLAlchemy会自动为你唯一地生成一个id号。这一行代码将在数据库中创建预期的表。
下面的代码将把我们的数据推送到表中。