You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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等写操作后如果不主动提交,所有修改都会在连接关闭时自动回滚,导致数据根本没写入数据库。

具体解决步骤:

  1. 添加事务提交
    在循环执行完所有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()
  1. 优化:规避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'])
    )
  1. 关于Cursor输出的说明
    conn.execute()会返回Cursor对象,如果你在交互式环境(比如Python Shell)中执行代码,解释器会自动打印返回值,这就是你看到那些Cursor信息的原因。把代码放到脚本文件中执行就不会出现这类输出。

内容的提问来源于stack exchange,提问作者Saeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 06:56:00