Python SQLite3跨表参数选元素及按国家名称查城市的实现方法
嘿,我来帮你搞定这两个和SQLite、Flask相关的问题:
问题1:Python操作SQLite3时,如何通过另一个表的参数选择元素?
要实现这个需求,核心是用SQL的JOIN语句把两个关联的表连接起来,然后通过关联表的字段来过滤数据。举个例子,假设你有city和country两个表(和问题2的结构一致),想通过国家名称筛选对应的城市,具体实现如下:
- 用
JOIN关联city和country表(通过共同的country_id字段建立关联) - 在
WHERE子句里使用country表的目标字段(比如country.country)来过滤结果 - 用参数化查询传递参数,避免SQL注入风险
下面是Python操作SQLite3的示例代码:
import sqlite3 # 连接数据库 conn = sqlite3.connect('your_database.db') cursor = conn.cursor() # 要查询的目标国家名称 target_country = "Poland" # 执行关联查询,通过国家名称筛选城市 cursor.execute(''' SELECT city.city FROM city JOIN country ON city.country_id = country.country_id WHERE country.country = ? ''', (target_country,)) # 获取查询结果 results = cursor.fetchall() # 格式化结果为列表 cities = [city[0] for city in results] print(cities) # 关闭数据库连接 conn.close()
问题2:修改Flask接口,通过国家名称而非country_id获取城市列表
你原代码里已经完成了city和country表的关联,只需要调整WHERE条件,同时改成参数化查询来接收前端传递的国家名称参数,既满足需求又能避免SQL注入风险。
修改后的代码如下:
from flask import Flask, request, jsonify # 假设你的get_db()函数已经正确实现了数据库连接逻辑 @app.route('/citiess') def city_list3(): # 从URL查询参数中获取国家名称,增加参数缺失的判断 country_name = request.args.get('country_name') if not country_name: return jsonify({"error": "请提供country_name参数"}), 400 db = get_db() # 修改WHERE条件为使用country表的country字段,并用参数化传递值 data = db.execute(''' SELECT city FROM city JOIN country ON city.country_id = country.country_id WHERE country.country = ? ''', (country_name,)).fetchall() # 简化结果格式化逻辑 data_json = [item[0] for item in data] return jsonify(data_json)
关键修改点说明:
- 用
request.args.get('country_name')获取URL查询参数(比如请求/citiess?country_name=Poland就能获取波兰的城市列表) - 将
WHERE条件从固定的city.country_id = 76改为country.country = ?,直接通过国家名称过滤数据 - 使用参数化查询的
?占位符传递country_name,彻底避免SQL注入攻击 - 增加了参数缺失的判断,返回友好的错误提示,提升接口健壮性
内容的提问来源于stack exchange,提问作者derriadiergummi
相关产品推荐
相关产品推荐

