Python3 Sqlite3 - 如果value为null,则不插入

时间:2018-03-30 11:59:45

标签: python python-3.x sqlite

我使用的是Python3.6和sqlite3

如果值不为null,我怎样才能将值插入数据库? 我已经通过插入200个重复行来测试数据库,只是为了确保INSERT或IGNORE工作良好,然后我得到200行全部由NULL填充。

我的INSERT代码是:

cursor.execute("""INSERT OR IGNORE INTO mytable (
    column1,
    column2,
    column3,
    column4,     /* INT, PRIMARY KEY, UNIQUE
    column5,
    column6) 
VALUES (?,?,?,?,?,?)""",
(
    value1,
    value2,
    value3,
    value4,
    value5,
    value6))
conn.commit()

如何解决这个问题?

现在,当我写这篇文章时,我认为可能因为我的PRIMARY KEY专栏不是第一篇?这可能是真的吗?

1 个答案:

答案 0 :(得分:1)

INSERT OR IGNORE说要插入但忽略冲突(不要这样做)。违反/不遵守CONSTRAINT时会发生冲突。

看起来你几乎没有CONSTRAINTS,只猜测隐含的CONSTRAINTS。也就是说,如果你有column4 INTEGER PRIMARY KEY或与AUTOINCREMENT相同,那么隐含的CONSTRAINTS(其中2​​个)是UNIQUE NOT NULL。但是,这样的列( rowid 的别名)是特殊的,并且指定NULL会在列中分配一个在表中唯一的整数(即它唯一地标识该行)。

P.S。列位置没有区别。

因此,回到猜测,没有一列具有特定的CONSTRAINT编码,因此忽略不会被触发,因为没有CONFLICT,因为没有CONSTRAINTS。

您应该做的是,您不希望NULL成为有效值的每一列都是将列定义更改为在列定义中包含NOT NULL(在列名和列类型之后)。

而不是(例如)有: -

CREATE TABLE mytable (
    column1 TEXT,
    column2 TEXT,
    column3 TEXT,
    column4 INTEGER PRIMARY KEY,
    column5 TEXT,
    column6 TEXT
);

你会: -

CREATE TABLE mytable (
    column1 TEXT NOT NULL,
    column2 TEXT NOT NULL,
    column3 TEXT NOT NULL,
    column4 INTEGER PRIMARY KEY,
    column5 TEXT NOT NULL,
    column6 TEXT NOT NULL
);

因此使用上表和以下SQL: -

-- NOTE column4 omitted from list of columns thus null
INSERT OR IGNORE INTO mytable (column1,column2,column3,column5,column6) VALUES
    (1,2,3,4,5),        -- Will be inserted as no conflict
    (6,7,null,null,10), -- conflict so ignored
    (11,12,13,14,15),  -- no conflict
    (null,17,18,19,20), -- conflict
    (21,22,23,24,25), -- no conflict
    (26,null,28,29,230) -- conflict
;

即使尝试插入空值,也只会插入3行且没有空值: -

enter image description here

虽然如果表是根据上面的第一个CREATE SQL定义的,但INSERT SQL的结果应该是: -

enter image description here