SQLite是否支持运行已存储的insert或update查询?
SQLite 运行已存储的 INSERT/UPDATE 查询说明
首先明确结论:SQLite 本身没有原生提供类似 MS Access 的「保存查询」、或者传统关系型库的存储过程这类内置数据库对象,无法直接调用保存在数据库引擎内的命名 INSERT/UPDATE 语句,但可以通过几种替代方案实现完全一致的使用效果。
常用实现方案
方案1:应用层预存查询逻辑
直接把常用的 INSERT/UPDATE 语句定义在应用代码的配置项、常量模块中,执行时通过参数化查询传入动态参数即可,Python 中使用 sqlite3 库的示例如下:import sqlite3 # 建立数据库连接 conn = sqlite3.connect("your_database.db") cur = conn.cursor() # 这里就是你预存的更新查询逻辑,存在应用侧即可复用 PREDEFINED_UPDATE_QUERY = "UPDATE goods SET stock = stock - ? WHERE goods_id = ?" # 传入参数执行 cur.execute(PREDEFINED_UPDATE_QUERY, (2, 1001)) conn.commit()方案2:数据库内自建存储查询表
如果需要把查询逻辑和应用代码解耦、保存在 SQLite 库文件内,可以自行创建一张存储查询的管理表,按需存、取查询语句执行:- 先创建存储查询的表:
CREATE TABLE stored_queries ( query_name TEXT PRIMARY KEY, query_sql TEXT NOT NULL ); - 把你需要复用的 INSERT 语句存入该表:
INSERT INTO stored_queries (query_name, query_sql) VALUES ('insert_new_order', 'INSERT INTO `order` (user_id, goods_id, buy_num) VALUES (?, ?, ?)'); - 需要调用时先从表中取出SQL再执行:
# 取出预存的查询语句 cur.execute("SELECT query_sql FROM stored_queries WHERE query_name = ?", ("insert_new_order",)) insert_sql = cur.fetchone()[0] # 传入参数执行 cur.execute(insert_sql, (123, 1001, 2)) conn.commit()
- 先创建存储查询的表:
方案3:触发器实现自动执行的写入逻辑
如果你的写入操作是满足特定条件自动触发的,不需要主动调用,可以直接用 SQLite 原生支持的触发器实现,触发条件满足时会自动执行对应的 INSERT/UPDATE 逻辑。
注意:所有涉及动态参数的场景,必须使用参数化查询传参,禁止直接拼接SQL字符串,避免出现SQL注入风险。
内容的提问来源于stack exchange,提问作者accpert.com
相关产品推荐
相关产品推荐

