优草派  >   Python

pyMySQL SQL语句传参问题,单个参数或多个参数说明

刘婷婷            来源:优草派

在使用Python编写MySQL数据库的查询或更新操作时,我们通常使用pymysql库来连接数据库和执行SQL语句。在执行SQL语句时,我们经常需要传递参数,比如查询某个表中符合条件的数据,或者更新某个表中的数据。本文将从多个角度分析pyMySQL SQL语句传参问题,包括单个参数和多个参数的情况。

1. 单个参数传递

pyMySQL SQL语句传参问题,单个参数或多个参数说明

在执行SQL语句时,我们通常使用问号?来表示需要传递的参数,然后使用execute()方法来执行SQL语句,例如:

```python

import pymysql

conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', port=3306)

cursor = conn.cursor()

sql = "select * from user where id = ?"

cursor.execute(sql, (1,))

result = cursor.fetchone()

print(result)

cursor.close()

conn.close()

```

在上面的代码中,我们查询了user表中id为1的记录,并使用了问号?来表示需要传递的参数。使用execute()方法时,我们将参数值(1,)作为第二个参数传递给execute()方法。

2. 多个参数传递

在实际应用中,我们通常需要传递多个参数。这时我们可以使用元组(tuple)或列表(list)来存储多个参数值,然后将元组或列表作为第二个参数传递给execute()方法。例如:

```python

import pymysql

conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', port=3306)

cursor = conn.cursor()

sql = "select * from user where age between ? and ?"

cursor.execute(sql, (18, 30))

result = cursor.fetchall()

print(result)

cursor.close()

conn.close()

```

在上面的代码中,我们查询了user表中年龄在18到30岁之间的记录,并使用了问号?来表示需要传递的参数。使用execute()方法时,我们将参数值(18, 30)作为第二个参数传递给execute()方法。

3. 字典传递参数

在实际应用中,我们常常使用字典(dict)来存储多个参数值,然后将字典作为参数传递给execute()方法。例如:

```python

import pymysql

conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', port=3306)

cursor = conn.cursor()

sql = "select * from user where name = %(name)s and age = %(age)s"

cursor.execute(sql, {'name': '张三', 'age': 20})

result = cursor.fetchall()

print(result)

cursor.close()

conn.close()

```

在上面的代码中,我们查询了user表中姓名为张三且年龄为20的记录,并使用了字典来存储参数值。使用execute()方法时,我们将字典{'name': '张三', 'age': 20}作为第二个参数传递给execute()方法,并且在SQL语句中使用%(key)s来表示需要传递的参数。

4. 执行多条SQL语句

在实际应用中,我们有时需要执行多条SQL语句,例如批量插入或更新数据。这时我们可以使用executemany()方法来执行多条SQL语句。例如:

```python

import pymysql

conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', port=3306)

cursor = conn.cursor()

sql = "insert into user(name, age) values(%s, %s)"

data = [('张三', 20), ('李四', 30), ('王五', 40)]

cursor.executemany(sql, data)

conn.commit()

cursor.close()

conn.close()

```

在上面的代码中,我们插入了3条记录,并使用了executemany()方法来执行多条SQL语句。使用executemany()方法时,我们将参数值的列表作为第二个参数传递给executemany()方法。

5. SQL注入问题

在使用pyMySQL执行SQL语句时,我们需要注意SQL注入问题。SQL注入是指攻击者通过在SQL语句中注入恶意代码,来获取或修改数据库中的数据。例如:

```python

import pymysql

conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', port=3306)

cursor = conn.cursor()

name = "张三';drop table user;"

sql = "select * from user where name = '%s'" % name

cursor.execute(sql)

result = cursor.fetchall()

print(result)

cursor.close()

conn.close()

```

在上面的代码中,我们查询了user表中姓名为张三';drop table user;的记录,并在SQL语句中注入了恶意代码,导致user表被删除。为了避免SQL注入问题,我们应该使用参数化查询,而不是直接拼接SQL语句。

【原创声明】凡注明“来源:优草派”的文章,系本站原创,任何单位或个人未经本站书面授权不得转载、链接、转贴或以其他方式复制发表。否则,本站将依法追究其法律责任。
TOP 10
  • 周排行
  • 月排行