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