cur.execute(sql,args)和cur.execute(sql)的区别

本文介绍两种在Python中执行SQL语句的方法,强调了使用参数化查询以防止SQL注入攻击的重要性。第一种方法直接使用字符串格式化,存在安全隐患;第二种方法采用参数化查询,通过元组传递参数,增强安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python代码示例:

  1. 方式一:

    userid = “123”
    sql = “select id,name from user where id = ‘%s’” % userid
    cur.execute(sql)

  2. 方式二:
    “”"
    sql语句模板中的参数填充符是 %s 而不是 ‘%s’ ,且多个参数需要用元祖存放,单个参
    数可直接传递
    “”"
    userid = “123”
    sql = "“select id,name from user where id = %s and name =%s”
    cur.execute(sql, (‘123’, ‘云天明’))

区别:
方式一会存在sql注入的风险,方式二中用python内置的方法可以对sql语句中传入的参数进行校验,在一定程度上屏蔽掉sql注入,增加了sql的安全性,在不便直接使用sqlArchemy框架(底层实现也是调用的方式二)的情况下,建议选择方式二。

# 创建一个web服务器的实例,实例的名称为app app = Flask('__name__') db_path = os.path.join(os.getcwd(), 'apple.db') # 数据库路径 model_path = os.path.join(os.getcwd(), 'models/densenet121.keras') # 模型路径 # 写出第一个web服务,RESTful风格的API @app.route('/') # 根目录服务端点 def index(): message = {'db': 'apple.db', 'model': 'densenet121.keras'} return jsonify(message) # 第二个服务,HTTP状态码测试 @app.route('/not_found123') def not_found(): return jsonify(message='请求的资源不存在!'), 407 # 第三个服务,获取URL参数 @app.route('/parameters') def parameters(): name1 = request.args.get('name') # 命令行参数 if name1 in ['健康叶片', '苹果黑星病', '苹果锈病', '多种病症']: return jsonify(message='数据库中存在请求数据:' + name1), 200 else: return jsonify(message='数据库不存在请求数据:' + name1), 404 # 第四个服务,注册服务 @app.route('/register', methods=['POST']) def register(): email1 = request.form['email'] # 获取表单数据 conn = lite.connect(db_path) # 数据库连接 with conn: # 访问数据库 cur = conn.cursor() # 数据库游标 sql = f"select count(email) from user where email = '{email1}'" cur.execute(sql) # 数据库中执行SQL语句 count = cur.fetchone()[0] if count > 0: # 存在重复邮箱 return jsonify(message='注册邮箱已经存在,拒绝注册!'), 409 else: # 获取表单中其余数据 name1 = request.form['name'] password1 = request.form['password'] sql = f"insert into user (name, email, password) values ('{name1}', '{email1}', '{password1}')" cur.execute(sql) return jsonify(message='注册成功!'), 200 #创建数据表 @app.route('/create_table', methods=['POST']) def create_table(): conn = lite.connect(db_path) with conn: cur = conn.cursor() # 创建 result 表 cur.execute(''' CREATE TABLE IF NOT EXISTS result ( id INTEGER PRIMARY KEY AUTOINCREMENT, image_id TEXT NOT NULL UNIQUE, category TEXT NOT NULL ) ''') conn.commit() return jsonify(message='数据表 result 创建成功!'), 200根据代码给出实验分析实验总结
最新发布
04-03
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值