如何在 SQLAlchemy 中定义无符号整数
Posted
技术标签:
【中文标题】如何在 SQLAlchemy 中定义无符号整数【英文标题】:How to define an unsigned integer in SQLAlchemy 【发布时间】:2013-11-12 02:54:32 【问题描述】:我正在使用 Flask-SQLAlchemy (mysql) 将门户迁移到 Flask。下面是我用来为现有门户创建数据库的代码:
Users = """CREATE TABLE Users(
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
UserName VARCHAR(40) NOT NULL,
FirstName VARCHAR(40) NOT NULL,
LastName VARCHAR(40) NOT NULL,
EmailAddress VARCHAR(255) NOT NULL,
Password VARCHAR(40) NOT NULL,
PRIMARY KEY (id)
) """
这是我尝试在 SQLAlchemy 中使用它的方式:
class Users(db.Model):
id = db.Column(db.Integer, primary_key=True)
UserName = db.Column(db.String(40))
FirstName = db.Column(db.String(40))
LastName = db.Column(db.String(40))
EmailAddress = db.Column(db.String(255))
Password = db.Column(db.String(40))
我的问题是,如何将 SQLAlchemy 模型指定为无符号整数?
【问题讨论】:
我正在修改您的问题以将其范围限制为单个问题(如何将整数指定为无符号)。如果您愿意,请为您的第二个问题提出第二个问题。我建议在codereview.stackexchange.com 上询问“这是我的代码,请提出建议”。 【参考方案1】:SQLAlchemy 类型(例如Integer)似乎试图遵守标准的 SQL 数据类型。由于“无符号整数”不是标准数据类型,您不会看到类似 UnsignedInteger
或 Integer(unsigned=True)
的内容。
在这种情况下(如 MySQL 等数据库的数据类型本身不是标准数据类型或具有不标准的选项),您可以通过获取特定方言的类型来访问这些类型/选项。对于 MySQL,可以通过sqlalchemy.dialects.mysql
module 访问这些类型,像这样...
from sqlalchemy.dialects.mysql import INTEGER
class Users(db.Model):
id = db.Column(INTEGER(unsigned=True), primary_key=True)
UserName = db.Column(db.String(40))
FirstName = db.Column(db.String(40))
LastName = db.Column(db.String(40))
EmailAddress = db.Column(db.String(255))
Password = db.Column(db.String(40))
【讨论】:
请注意,我从未真正尝试过使用无符号整数作为 SQLAlchemy 的主键,但我看不出它为什么不能工作。【参考方案2】:可能已经很晚了,但是如果您希望您的模型类能够管理多个数据库引擎,例如 MySQL 和 SqlLite(例如在单元测试期间)。你可以做的是:
UnsignedInt = Integer()
UnsignedInt = UnsignedInt.with_variant(INTEGER(unsigned=True), 'mysql')
在你的声明模型中:
class Meta(Base):
__tablename__ = 'meta'
meta_id = Column(UnsignedInt, primary_key=True)
meta_key = Column(String(64), nullable=False, )
meta_value = Column(String(128))
species_id = Column(UnsignedInt)
【讨论】:
以上是关于如何在 SQLAlchemy 中定义无符号整数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rust 中将有符号整数添加到无符号整数,检查无符号溢出?
将负双精度转换为无符号整数的行为是不是在 C 标准中定义? ARM 与 x86 上的不同行为