【问题标题】:Sqlite not using default valuesSqlite 不使用默认值
【发布时间】:2018-02-24 00:27:03
【问题描述】:

使用时:

import datetime
import sqlite3

db = sqlite3.connect('mydb.sqlite', detect_types=sqlite3.PARSE_DECLTYPES)
c = db.cursor()
db.text_factory = str

c.execute('create table if not exists mytable (date timestamp, title str, \
    custom str, x float, y float, z char default null, \
    postdate timestamp default null, id integer primary key autoincrement, \
    url text default null)')
c.execute('insert into mytable values(?, ?, ?, ?, ?)', \
    (datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))

我有:

sqlite3.OperationalError: table mytable 有 9 列但提供了 5 个值

为什么 SQlite 不采用默认值(在表创建期间指定)来考虑填充新行?

(另外,当我重新打开我几年前写的一个项目时,我在 sqlite3 文档中找不到 strchar 数据类型了,它仍然相关吗?)

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    如果您只想为某些列提供值,则需要指定哪些列。否则引擎将不知道将它们放在哪里。此行需要更改:

    c.execute('insert into mytable values(?, ?, ?, ?, ?)', \
    (datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))
    

    到这里:

    c.execute('insert into mytable (date, title, custom, x, y)values(?, ?, ?, ?, ?)', \
    (datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))
    

    【讨论】:

    • 谢谢。我刚刚注意到,在使用您的解决方案时,甚至不需要使用default null 创建一个表:即使我删除了所有default null,它仍然适用于您的解决方案,所有这些值都将默认为None
    • @Basj 是的。 Null 是默认默认值。
    【解决方案2】:

    因为您是说要通过不指定特定列来插入所有列。

    更改'insert into mytable values(?, ?, ?, ?, ?)'

    'insert into mytable (date, title, custom, x, y) values(?, ?, ?, ?, ?)'

    几乎可以为列类型指定任何值,该值将遵循一组规则并转换为 TEXT、INTEGER、REAL、NUMERIC 或 BLOB。但是,您可以在任何列中存储任何类型的值。

    • STR 将解析为 NUMERIC,
    • TIMESTAMP 将解析为 NUMERIC,
    • FLOAT 将解析为 REAL,
    • CHAR 到 TEXT。

    阅读Datatypes In SQLite 或者看看How flexible/restricive are SQLite column types?

    【讨论】:

      【解决方案3】:

      示例解决方案

      cursor.execute('CREATE TABLE vehicles_record (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)')
      

      上面的SQLite3查询

      cursor.execute("INSERT INTO vehicles_record(name) VALUES(?)", (name))
      

      结果

      id 为 1,name 为 name var 的值,最后一列的当前时间戳。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多