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

Python中使用Sqlite3操作数据库时能否将表名设置为变量?

实现方案

SQLite 的参数化查询占位符 ? 仅支持传入字段值,不支持传入表名、字段名这类 SQL 结构标识符,所以不能直接把表名放到 execute 的参数元组里,需要先把表名拼接到SQL语句中,同时做好安全校验避免SQL注入风险。

标准实现代码(适配常规表名)

import sqlite3

def ChangeTable(c, table_name, a):
    # 校验表名合法性,避免SQL注入,符合SQLite标准表名命名规则(字母、数字、下划线,非数字开头)
    if not table_name.isidentifier():
        raise ValueError(f"非法表名:{table_name}")
    # 拼接表名到SQL语句
    delete_sql = f"DELETE FROM {table_name} WHERE id = ?"
    # 字段值依然用参数化传递,保证安全
    c.execute(delete_sql, (a,))

特殊表名适配(含空格、中文等特殊字符)

如果业务允许表名包含特殊字符,需要给拼接的表名外层加双引号,同时额外校验表名内不含双引号避免注入:

def ChangeTable(c, table_name, a):
    # 校验表名不含双引号,避免注入
    if '"' in table_name:
        raise ValueError(f"非法表名:{table_name}")
    delete_sql = f'DELETE FROM "{table_name}" WHERE id = ?'
    c.execute(delete_sql, (a,))

调用示例

# 连接数据库示例
conn = sqlite3.connect("your_database.db")
cur = conn.cursor()
# 删除 order_table 中id为10的记录
ChangeTable(cur, "order_table", 10)
conn.commit()
conn.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:36:08