Python SQLite NOT NULL约束不使用INSERT或IGNORE
我使用Python2.7和SQLite3 代码如下: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,
#!/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的字符串
如果希望插入SQLNULL
,请使用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。顺便问一下,我如何知道哪一行插入成功,哪一行在冲突时被忽略?