如何在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
相关产品推荐
相关产品推荐

