为什么我的SQLite数据库TICKER列所有值都被填充为None?
问题原因及修复方案
问题原因
你对INSERT语句的作用理解错误:INSERT操作是新增数据表行,而非修改已有的行。
- 第一次遍历
url_list插入数据时,每执行一次INSERT就会生成1条新行,这些行仅URL字段有赋值,TICKER字段未传值所以默认是NULL,STATUS字段使用默认值Not started,这一步会生成和url_list长度一致的新行。 - 第二次遍历
ticklist插入数据时,依然使用INSERT操作,会再生成和ticklist长度一致的新行,这些行仅TICKER字段有赋值,URL字段默认是NULL。
你查询返回的结果是第一次插入的URL行,所以所有行的TICKER字段都显示为None。
修复方案
正常业务中URL和对应TICKER是一一对应的,直接修改插入逻辑,每次插入同时赋值URL和TICKER两个字段即可,修复后代码如下:
import sqlite3 conn = sqlite3.connect('tickers.db') # 建表时指定字段类型使用更规范 conn.execute('''CREATE TABLE TAB(URL TEXT, TICKER TEXT, STATUS TEXT DEFAULT "Not started");''') # 两个列表按位置配对,一次插入两个字段 for url, ticker in zip(url_list, ticklist): conn.execute("INSERT INTO TAB(URL, TICKER) VALUES(?, ?)", (url, ticker)) # 提交事务,否则数据不会持久化保存到数据库文件 conn.commit() for row in conn.execute("SELECT URL, TICKER, STATUS from TAB"): print(f'URL={row[0]}') print(f'TICKER={row[1]}') print(f'STATUS={row[2]}') # 操作完成后关闭连接 conn.close()
如果确实存在先批量插入URL,后续再补录对应TICKER的场景,需要给数据表新增自增主键字段,插入URL时记录对应主键ID,后续通过主键ID匹配行执行UPDATE操作修改TICKER字段的值即可。
内容的提问来源于stack exchange,提问作者Nish
相关产品推荐
相关产品推荐

