peewee:Python int 太大而无法转换为 SQLite INTEGER

mau*_*gch 3 python sqlite python-3.x peewee

我有以下代码:

from peewee import Model, CharField, BigIntegerField, DateTimeField, SqliteDatabase
db = SqliteDatabase('samples.db')

class UnsignedIntegerField(BigIntegerField):
    field_type = 'int unsigned'

class MyBaseModel(Model):
    class Meta:
        database = db

class Sample(MyBaseModel):
    myint = UnsignedIntegerField(index=True)
    description = CharField(default="")


Sample.create_table()

sample = Sample()
sample.description = 'description'
sample.myint = '15235670141346654134'
sample.save()
Run Code Online (Sandbox Code Playgroud)

代码给了我上面提到的错误。之后,如果我尝试手动插入值,则没有问题:

insert into sample (description,myint) values('description',15235670141346654134);
Run Code Online (Sandbox Code Playgroud)

这是架构的显示方式:

 CREATE TABLE IF NOT EXISTS "sample" ("id" INTEGER NOT NULL PRIMARY KEY, "myint" int unsigned NOT NULL, "description" VARCHAR(255) NOT NULL);
CREATE INDEX "sample_myint" ON "sample" ("myint");
Run Code Online (Sandbox Code Playgroud)

出于某种原因,peewee 无法使用 sqlite 的 unsigned int。我确实在 cygwin 的最新 sqlite 驱动程序上尝试过。我正在使用python3。

Sha*_*awn 6

Sqlite 整数是有符号的 64 位值。它没有任何无符号类型的概念。它所拥有的是对列类型的任意字符串的极其自由的接受;CREATE table ex(col fee fie fo fum);已验证。请参阅有关如何将列类型转换为列关联性和其他重要详细信息的文档

因此,它可以作为整数保存的最大数字是 9223372036854775807,它小于您尝试插入的 15235670141346654134。您需要告诉您的 ORM 将其存储为字符串或 blob,并在它和 Python 任意大小的整数之间进行转换。

当你做手册

insert into sample (description,myint) values('description',15235670141346654134);
Run Code Online (Sandbox Code Playgroud)

然后查看表格中的那一行,您会看到那个非常大的数字被转换为浮点 ( real) 值(任何大于整数所能容纳的数字文字都被视为一)。这不太可能是您想要的,因为它会导致数据丢失。