一、概述
在Python的数据库编程中,我们经常会用到的是cursor.execute(sql)这个函数,它用来执行SQL语句,并且返回受影响的行数。它是Python DB-API规范所要求实现的一个方法。在这篇文章中,我们将围绕这个方法,从以下几个方面进行讲解:
二、参数
cursor.execute()函数的参数是SQL语句。这个语句可以是一个字符串变量或是直接写到函数里的,具体可以看下面的示例:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, "record inserted.")
在这个例子中,我们使用了mysql.connector这个库来连接MySQL数据库,同时用cursor()方法定义了游标对象mycursor。使用了一条SQL语句INSERT INTO来新增一条数据到数据库表格customers中。
在游标对象mycursor上,我们调用了execute()方法并且传入了sql和val两个参数。其中sql是一个SQL语句字符串,val是一个元组。这里使用了?作为占位符,那么就要按照?的顺序传入后面的数据。
三、执行结果
在执行完cursor.execute()方法后,我们可以调用一些其他的方法来获取执行结果。
1、调用rowcount属性可以获取受影响的行数,例如:
mycursor.execute("SELECT * FROM customers")
myresult = mycursor.fetchall()
print("Number of rows in customers is: ", mycursor.rowcount)
2、调用fetchone()、fetchmany()或者fetchall()方法,分别返回一条、多条或所有数据。
例如,下面的代码会返回所有customers表的数据:
mycursor.execute("SELECT * FROM customers")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
四、防止SQL注入
SQL注入攻击是数据库编程中的一个比较棘手的问题。如果我们在构造SQL语句的时候,不小心将来自用户输入的数据拼接进去,那么就存在被攻击的风险。为了防止这种情况的发生,我们需要使用参数化查询而不是直接拼接字符串。而参数化查询就是在SQL语句中使用占位符,然后将参数传入到函数中来进行替换。比如:
sql = "SELECT * FROM customers WHERE address = %s"
adr = ("Yellow Garden 2", )
mycursor.execute(sql, adr)
在这个例子中,我们在SQL语句中使用了一个占位符%s。在调用execute()方法时,我们将指定的元组传入到方法中,作为替换占位符的参数。这样,即使从用户输入的数据中截取了字符串,也不会造成SQL注入的问题。
五、批量操作
在Python中,我们也可以使用executemany()方法对多条SQL语句进行批处理。方法的使用方式与execute()类似,只不过需要传入的数据不同而已。比如:
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = [
('Peter', 'Lowstreet 4'),
('Amy', 'Apple st 652'),
('Hannah', 'Mountain 21'),
('Michael', 'Valley 345'),
('Sandy', 'Ocean blvd 2'),
('Betty', 'Green Grass 1'),
('Richard', 'Sky st 331'),
('Susan', 'One way 98'),
('Vicky', 'Yellow Garden 2'),
('Ben', 'Park Lane 38'),
('William', 'Central st 954'),
('Chuck', 'Main Road 989'),
('Viola', 'Sideway 1633')
]
mycursor.executemany(sql, val)
mydb.commit()
print(mycursor.rowcount, "was inserted.")
在这个例子中,我们使用了一个包含多个元组的列表val。在调用executemany()方法时,我们将sql和这个元组列表作为参数传入。这样就可以批量地插入多个数据。
原创文章,作者:ABXC,如若转载,请注明出处:https://www.506064.com/n/146072.html