我有以下代码:
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()
该代码给了我上面提到的错误。之后,如果我尝试手动插入值,我就没有问题了:
insert into sample (description,myint) values('description',15235670141346654134);
架构如下所示:
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");
由于某种原因,peewee 无法使用 sqlite 的 unsigned int。我确实在 cygwin 的最新 sqlite 驱动程序上尝试过。我用的是python3。
Sqlite 整数是有符号的 64 位值。它没有任何无符号类型的概念。它所做的是极其自由地接受列类型的任意字符串;CREATE table ex(col fee fie fo fum);
已验证。看文档了解如何将列类型转换为列affinity以及其他重要细节。
因此,它可以作为整数保存的最大数字是 9223372036854775807,它小于您尝试插入的 15235670141346654134。您需要告诉 ORM 将其存储为字符串或 blob,并在其与 Python 任意大小的整数之间进行转换。
当你做手册的时候
insert into sample (description,myint) values('description',15235670141346654134);
然后查看表中的该行,您会发现那个非常大的数字已转换为浮点数(real
) 值(任何大于整数所能容纳的数字文字都被视为 1)。这不太可能是您想要的,因为它会导致数据丢失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)