Python SQLite NOT NULL约束不使用INSERT或IGNORE

Python SQLite NOT NULL约束不使用INSERT或IGNORE,python,sql,python-2.7,sqlite,Python,Sql,Python 2.7,Sqlite,我使用Python2.7和SQLite3 代码如下: #!/usr/bin/env python import sqlite3 conn = sqlite3.connect('example.db') c = conn.cursor() c.execute('''CREATE TABLE stocks (transctionid text not null collate nocase primary key, trans text,

我使用Python2.7和SQLite3

代码如下:

#!/usr/bin/env python

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE stocks
             (transctionid text not null collate nocase primary key,
             trans text,
             symbol text not null,
             qty real,
             price real)''')
purchases = [('B1Jan', 'BUY', 'IBM', 1000, 45.00),
             ('C2Jan', 'BUY', 'MSFT', 1000, 72.00),
             ('D3Jan', 'SELL', 'IBM', 500, 53.00),
             ('d3jan', 'SELL', 'IBM', 500, 53.00),
             ('', 'SELL', 'IBM', 500, 53.00),
             ('E5Jan', 'SELL', '', 500, 53.00),
            ]
c.executemany('INSERT OR IGNORE INTO stocks VALUES (?,?,?,?,?)', purchases)
conn.commit()
for row in c.execute('SELECT * FROM stocks ORDER BY price'):
    print row
conn.close()
结果是:

(u'B1Jan', u'BUY', u'IBM', 1000.0, 45.0)
(u'D3Jan', u'SELL', u'IBM', 500.0, 53.0)
(u'', u'SELL', u'IBM', 500.0, 53.0)
(u'E5Jan', u'SELL', u'', 500.0, 53.0)
(u'C2Jan', u'BUY', u'MSFT', 1000.0, 72.0)
插入或忽略仅适用于“主键”约束。“非空”约束不起作用。

根据:

对于INSERT和UPDATE命令,关键字“ON CONFLICT”为 替换为“或”,使语法读起来更自然。例如 我们不是“插入冲突忽略”,而是“插入或忽略”。。。这个 ON CONFLICT子句适用于唯一和非空约束(以及 在本节中,主键约束为 与唯一约束相同)

我预期的结果是:

(u'B1Jan', u'BUY', u'IBM', 1000.0, 45.0)
(u'D3Jan', u'SELL', u'IBM', 500.0, 53.0)
(u'C2Jan', u'BUY', u'MSFT', 1000.0, 72.0)

顺便问一下,我如何知道哪一行插入成功,哪一行在冲突时被忽略?

空字符串不算作
NULL
,而是算作长度为0的字符串

如果希望插入SQL
NULL
,请使用
None

purchases = [('B1Jan', 'BUY', 'IBM', 1000, 45.00),
             ('C2Jan', 'BUY', 'MSFT', 1000, 72.00),
             ('D3Jan', 'SELL', 'IBM', 500, 53.00),
             ('d3jan', 'SELL', 'IBM', 500, 53.00),
             (None, 'SELL', 'IBM', 500, 53.00),
             ('E5Jan', 'SELL', None, 500, 53.00),
            ]
请参阅
sqlit3
文档的一节

如果需要知道行是否插入成功,请使用
cursor.execute()
逐个插入,然后检查
cursor.rowcount
.rowcount
反映了使用
NULL
值调用
.executemany()
时受影响的行数。rowcount为
3
,没有关于哪些行成功和哪些行失败的信息。

'
与NULL不同。将
''
替换为
None

如果要知道哪些行违反了约束,请删除
或忽略
,然后处理
sqlite3.IntegrityError
。下面的代码示例逐个插入行并打印(可以修改为写入文件、记录错误表等),这样您就可以知道哪些值无法插入以及原因:

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE stocks
             (transctionid text not null collate nocase primary key,
             trans text,
             symbol text not null,
             qty real,
             price real)''')
purchases = [('B1Jan', 'BUY', 'IBM', 1000, 45.00),
             ('C2Jan', 'BUY', 'MSFT', 1000, 72.00),
             ('D3Jan', 'SELL', 'IBM', 500, 53.00),
             ('d3jan', 'SELL', 'IBM', 500, 53.00),
             (None, 'SELL', 'IBM', 500, 53.00),
             ('E5Jan', 'SELL', None, 500, 53.00)]
for purchase in purchases:
    try:
        c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', purchase)
    except sqlite3.IntegrityError as e:
        print "Couldn't insert row {}:\n {}".format(purchase, e)
        pass
conn.commit()
for row in c.execute('SELECT * FROM stocks ORDER BY price'):
    print row
conn.close()

顺便问一下,我如何知道哪一行插入成功,哪一行在冲突时被忽略?逐个插入和行计数方法似乎非常低效且耗时。有更好的方法吗?没有。
或IGNORE
文档明确说明没有错误,我们唯一的其他反馈是rowcount。顺便问一下,我如何知道哪一行插入成功,哪一行在冲突时被忽略?