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

Python+SQLite能否通过传入变量查询列?及添加共享扳手条件方法

解答你的两个SQLite3使用问题

1. 能否用变量指定查询列?

当然可以!不过直接拼接字符串要注意SQL注入风险,所以最好先验证列名是否在允许的范围内,再动态生成SQL语句。举个实用的例子:

假设你想动态指定要查询的列,先定义合法的列列表做校验,再拼接SQL:

# 预先定义允许查询的列(避免恶意注入)
allowed_columns = ['id', 'desc', 'dept', 'user', 'is_shared']
# 传入的目标列(比如从业务逻辑或用户配置来)
target_columns = ['id', 'desc']

# 先验证列名合法性
if all(col in allowed_columns for col in target_columns):
    cols_str = ', '.join(target_columns)
    query = f'''select {cols_str} from wrenches as w join users as u on w.dept = u.dept and w.user = u.id where u.id = :user order by w.id asc'''
    wrenches = db.execute(query, {'user': session['user_id']}).fetchall()
else:
    # 处理非法列名的情况
    raise ValueError("Invalid column names provided")

这种方式既实现了动态列查询,又能有效防止SQL注入攻击。

2. 添加共享状态+同部门的筛选条件

假设你的wrenches表有个字段(比如is_shared)用来标记扳手是否处于共享状态,原查询里已经通过w.dept = u.dept关联了用户和扳手的部门,所以只需要在WHERE子句里追加共享状态的判断即可:

修改后的完整代码:

wrenches = db.execute(''' 
    select w.id, w.desc 
    from wrenches as w 
    join users as u on w.dept = u.dept and w.user = u.id 
    where u.id = :user 
      and w.is_shared = 1  -- 这里假设1代表共享状态,可根据实际字段值调整
    order by w.id asc
''', {'user': session['user_id']}).fetchall()

如果共享状态需要通过变量动态传入(比如不同场景下筛选共享/非共享),还可以用参数绑定的方式:

# 假设shared_status是传入的变量,比如1(共享)或0(非共享)
shared_status = 1
wrenches = db.execute(''' 
    select w.id, w.desc 
    from wrenches as w 
    join users as u on w.dept = u.dept and w.user = u.id 
    where u.id = :user 
      and w.is_shared = :shared
    order by w.id asc
''', {'user': session['user_id'], 'shared': shared_status}).fetchall()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:56:56