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

如何在SQLite3语句中使用Python变量?附用户表创建代码

在SQLite3语句中使用Python变量的正确姿势

嘿,我来帮你搞定这个问题!首先得强调一个关键原则:绝对不要直接把Python变量拼接进SQL字符串里——这会带来SQL注入风险,还可能因为变量格式问题导致语句报错。SQLite官方推荐用参数化查询来处理变量,下面就结合你的代码一步步完善。

1. 补全insert_user函数(参数化查询实现)

SQLite支持两种参数占位符:位置占位符?和命名占位符(比如:name),两种方式都很安全,选你顺手的就行。

方式一:位置占位符?

这种方式是把变量按顺序放进元组里传给execute()方法:

def insert_user(connection, date, username):
    cursor = connection.cursor()
    # 用?代替具体变量,SQL语句里不要直接写date或username
    sql_insert = "INSERT INTO user (date, username) VALUES (?, ?)"
    with connection:
        try:
            # 第二个参数是元组,顺序要和SQL里的?对应
            cursor.execute(sql_insert, (date, username))
            print("用户数据插入成功啦")
        except sqlite3.Error as e:
            print(f"插入出错了:{e}")

方式二:命名占位符

如果变量多,用命名占位符更清晰,不会搞混顺序:

def insert_user(connection, date, username):
    cursor = connection.cursor()
    # 用:xxx作为命名占位符,名字可以自定义
    sql_insert = "INSERT INTO user (date, username) VALUES (:user_date, :user_name)"
    with connection:
        try:
            # 第二个参数是字典,键对应占位符的名字
            cursor.execute(sql_insert, {"user_date": date, "user_name": username})
            print("用户数据插入成功啦")
        except sqlite3.Error as e:
            print(f"插入出错了:{e}")

2. 配套的建表SQL示例

你的create_table函数需要传入建表语句,这里给你一个适配user表的示例:

# 定义创建user表的SQL语句,确保字段和插入的变量对应
sql_create_user_table = """
CREATE TABLE IF NOT EXISTS user (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  # 自增主键,不用手动插入
    date TEXT NOT NULL,
    username TEXT NOT NULL
);
"""

3. 完整调用示例

把所有函数串起来用的例子,你可以直接运行测试:

if __name__ == "__main__":
    db_file = "your_database.db"  # 你的数据库文件名
    # 创建数据库连接
    conn = create_connection(db_file)
    if conn is not None:
        # 先创建user表
        create_table(conn, sql_create_user_table)
        # 准备要插入的变量,比如当前时间和用户名
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        target_username = "sun_bear"
        # 插入用户数据
        insert_user(conn, current_time, target_username)
        # 关闭连接
        conn.close()
    else:
        print("哎呀,没法创建数据库连接哦")

为什么要用参数化查询?

  • 安全:彻底避免SQL注入攻击,比如如果用户名是'; DROP TABLE user; --这种恶意内容,直接拼接会删掉你的表,但参数化查询会把它当成普通字符串处理。
  • 省心:SQLite会自动处理变量的类型转换,不用你手动转格式(比如datetime对象、特殊字符的转义)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:31:25