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

