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

Python调用含IN条件的SQL时,如何接收任意数量无格式输入变量

解决方案:让Python接收任意数量的命令行ID参数

当然可以实现!你只需要调整脚本逻辑,让它自动处理传入的多个独立ID参数,无需手动添加括号和逗号。下面是具体的实现步骤和代码示例:

核心思路

  • 接收所有传入的命令行参数(跳过脚本本身的名称)
  • 验证参数合法性(确保都是数字ID,可选但推荐)
  • 自动将参数格式化为SQL IN 子句需要的(id1, id2, id3)格式

修改后的完整代码示例

import sys

def main():
    # 获取所有传入的ID参数,sys.argv[0]是脚本文件名,所以取[1:]
    campaign_ids = sys.argv[1:]
    
    # 检查是否有传入参数
    if not campaign_ids:
        print("Error: Please provide at least one campaign ID")
        sys.exit(1)
    
    # 验证每个参数都是数字,避免非法输入导致SQL错误或注入风险
    if not all(id_str.isdigit() for id_str in campaign_ids):
        print("Error: All arguments must be numeric campaign IDs")
        sys.exit(1)
    
    # 自动生成IN子句的格式:用逗号连接ID,包裹在括号里
    in_clause = f"({', '.join(campaign_ids)})"
    
    # 构建完整的SQL语句
    f_statement1 = """set nocount on; set ansi_warnings off; 
SELECT c.campaign_name, ca.campaign_id, ca.product_id, p.product_name 
FROM [AN_MAIN].[dbo].[campaign_addon] ca 
JOIN product p ON p.product_id = ca.product_id 
JOIN campaign c ON c.campaign_id = ca.campaign_id 
WHERE ca.campaign_id IN """ + in_clause
    
    # 这里可以继续添加执行SQL的逻辑,比如连接数据库、执行查询等
    print("Generated SQL statement:")
    print(f_statement1)

if __name__ == "__main__":
    main()

使用方式

现在你可以直接在命令提示符里这样调用脚本:

addon.py 45123 51241

甚至传入更多ID:

addon.py 1001 1002 1003 1004

脚本会自动将这些ID转换成(45123, 51241)或者(1001, 1002, 1003, 1004)的格式,拼接到SQL语句中。

重要安全提示:避免SQL注入

直接拼接字符串到SQL语句中存在SQL注入风险,如果这些ID参数来自不可信的来源(比如用户输入),建议使用参数化查询来替代字符串拼接。以pyodbc为例,修改后的安全版本如下:

import sys
import pyodbc

def main():
    campaign_ids = sys.argv[1:]
    if not campaign_ids or not all(id_str.isdigit() for id_str in campaign_ids):
        print("Error: Please provide valid numeric campaign IDs")
        sys.exit(1)
    
    # 转换为整数类型(可选,根据数据库字段类型调整)
    campaign_ids = [int(id_str) for id_str in campaign_ids]
    
    # 构建带占位符的SQL查询
    query_template = """set nocount on; set ansi_warnings off; 
SELECT c.campaign_name, ca.campaign_id, ca.product_id, p.product_name 
FROM [AN_MAIN].[dbo].[campaign_addon] ca 
JOIN product p ON p.product_id = ca.product_id 
JOIN campaign c ON c.campaign_id = ca.campaign_id 
WHERE ca.campaign_id IN ({placeholders})"""
    
    # 生成与参数数量匹配的占位符(比如?, ?, ?)
    placeholders = ', '.join('?' * len(campaign_ids))
    final_query = query_template.format(placeholders=placeholders)
    
    # 连接数据库并执行参数化查询
    conn = pyodbc.connect("你的数据库连接字符串")
    cursor = conn.cursor()
    cursor.execute(final_query, campaign_ids)
    
    # 处理查询结果
    for row in cursor.fetchall():
        print(row)
    
    conn.close()

if __name__ == "__main__":
    main()

参数化查询会自动处理参数转义,彻底避免SQL注入问题,同时也更符合数据库操作的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:10:03