Python操作SQLite时INSERT未插入记录,求助排查代码问题
问题描述
我写了一段Python代码,本意是创建SQLite数据库、logs表并插入数据,但实际只创建了库和表,数据没插进去。执行INSERT后还输出了几个Cursor对象的信息,代码如下:
import os path = '/home/test/' os.system(f'rm -vf {path}myDB.db') import sqlite3 import datetime conn = sqlite3.connect(f"{path}myDB.db") conn.execute( ''' CREATE TABLE logs (id INTEGER PRIMARY KEY, userid INTEGER NOT NULL, email TEXT NOT NULL, ip_address TEXT, date DATE ); ''' ) clients = [ {'userid': 26026, 'email': 'firstfake@gmail.com', 'ip': '1.1.1.158', 'date': f'{datetime.datetime.now()}'}, {'userid': 31010, 'email': 'secondfake@yahoo.com', 'ip': '1.1.1.10', 'date': f'{datetime.datetime.now()}'}, {'userid': 26076, 'email': 'lastfake@gmail.com', 'ip': '1.1.1.160', 'date': f'{datetime.datetime.now()}'}, ] for out in clients: conn.execute( f""" INSERT INTO logs (id, userid, email, ip_address, date) VALUES (NULL, {out['userid']}, '{out['email']}', '{out['ip']}', '{out['date']}') """) conn.close() conn = sqlite3.connect(f"{path}myDB.db") conn.row_factory = sqlite3.Row c = conn.cursor() c.execute('SELECT * FROM logs') output = [] for r in c.fetchall(): output.append(dict(r)) for x in output: x conn.close()
执行后出现的输出:
<sqlite3.Cursor object at 0x7f393d757bc0> <sqlite3.Cursor object at 0x7f393d7578c0> <sqlite3.Cursor object at 0x7f393d757bc0>
请问我的代码哪里出问题了?
问题原因与解决方法
核心问题:未提交事务
SQLite默认开启事务模式,执行INSERT等写操作后如果不主动提交,所有修改都会在连接关闭时自动回滚,导致数据根本没写入数据库。
具体解决步骤:
- 添加事务提交
在循环执行完所有INSERT语句后,调用conn.commit()提交事务,再关闭连接。修改后的关键代码片段:
for out in clients: conn.execute( f""" INSERT INTO logs (id, userid, email, ip_address, date) VALUES (NULL, {out['userid']}, '{out['email']}', '{out['ip']}', '{out['date']}') """) # 新增提交操作,确保写入数据库 conn.commit() conn.close()
- 优化:规避SQL注入风险
你当前用f-string拼接SQL语句存在严重的SQL注入隐患,建议改用参数化查询,同时id是自增主键,无需手动传NULL,数据库会自动生成:
for out in clients: conn.execute( """ INSERT INTO logs (userid, email, ip_address, date) VALUES (?, ?, ?, ?) """, (out['userid'], out['email'], out['ip'], out['date']) )
- 关于Cursor输出的说明
conn.execute()会返回Cursor对象,如果你在交互式环境(比如Python Shell)中执行代码,解释器会自动打印返回值,这就是你看到那些Cursor信息的原因。把代码放到脚本文件中执行就不会出现这类输出。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

