gpt4 book ai didi

python - sqlite3 数据类型中的拼写错误但仍然有效,为什么?

转载 作者:行者123 更新时间:2023-12-03 02:21:00 24 4
gpt4 key购买 nike

我在编写schema.sql时不小心将sqlite3的数据类型写错了:


create table xxx(
id integer primary key autoincrement not null,
num integet
)

如您所见,integet 应该是 integer,但它仍然有效,这意味着我可以向其中插入数据。为什么?如何在不破坏数据库的情况下将其更正为整数?

最佳答案

作为 the Python sqlite3 module 的文档和 the database itself两者都说明,sqlite3 是无类型的。您可以将字符串值插入 INTEGER 列,或将整数值插入 VARCHAR 列。

但是,sqlite 有一个称为“列关联”的功能,如果列类型为 INTEGER 等,它将尝试以数字方式处理参数。并且 Python 模块尝试将每个 sqlite 类型映射到 Python 类型,因此如果sqlite 给它一个 INTEGER 列,Python 会将其映射到整数类型。

正如相应的文档所解释的:

If the declared type contains the string "INT" then it is assigned INTEGER affinity.

INTEGER int or long, depending on size

比较不区分大小写。任何不符合任何规则的内容都将被视为 NUMERIC,Python 将其视为 str/bytes/buffer(取决于您的版本)。

因此,对于 sqlite 本身来说,integet 匹配 INTEGER 的规则,因此,您可以存储整数值并将它们作为整数检索。 (当然,您仍然可以存储 'abc',并且您会将其作为字符串返回。)Python 会将其视为 INTEGER 列,因此尽可能将值读取为 int

<小时/>

对于问题的最后一部分,sqlite3 不提供任何方法在创建列后更改列的类型。事实上,ALTER TABLE命令仅允许添加新列或约束,或重命名表。

如果您需要修改实时数据库,您需要做的是创建一个包含正确列的新表,复制所有内容,删除旧表,然后重命名新表,如下所示:

CREATE TABLE yyy(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, num INTEGER)
INSERT INTO yyy SELECT * FROM xxx
DROP TABLE xxx
ALTER TABLE yyy RENAME TO xxx

您插入到旧表中的任何字符串值都将被复制 - 并且每次您随后获取它们时,因为列类型是INTEGER,Python将尝试转换为int 如果可能的话,而不是将它们保留为 bytesstr

关于python - sqlite3 数据类型中的拼写错误但仍然有效,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16788282/

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