MySQL与Python的交互
驱动模块
- MySQL Connentor是MySQL的官方驱动模块,对MySQL 8.0以上的兼容性比较好
- 选择对应的Python版本直接安装即可
创建连接
import mysql.connector
con = mysql.connector.connect(
host="localhost"
,port="3306",
user="root",
password="123456",
database="demo"
)
con.close()
游标
- MySQL Connector里面的游标用来执行SQL语句,而且查询返回的结果集会保存在游标中
cursor = con.cursor()
cursor.execute(sql语句)
例如:
cursor = con.cursor()
sql = "SELECT * FROM table"
cursor.execute(sql)
for one in cursor:
print(one[0],one[1],......)
fetchone()用法
- fetchone() 返回一条记录,如果没有记录,返回None
- 多次使用fetchone(),会依次取得下一条结果
cursor.execute(sql)
print(cursor.fetchone()[0])
fetchall()用法
- fetchall() 返回所有结果,如果没有,返回None
- fetchall() 返回的结果是二维元组
cursor=execute(sql)
result = cursor.fetchall()
for index in range(len(result)):
print(result[index])
循环执行SQL语句
- 游标对象中的executemany()可以反复执行一条SQL语句
cursor.executemany(sql)
事务控制
con.start_transaction([事务隔离级别])
con.commit()
con.rollback()
数据库连接池
- 数据库连接池预先创建出一些数据库连接,然后缓存起来,避免了程序语言反复创建呵销毁连接
- 在并发执行的应用程序中,数据库连接池显得尤为重要
config = {......}
pool = mysql.connector.pooling.MySQLConnectionPool(
**config,
pool_size=10
)
con=pool.get_connection()
SQL预编译机制
- 预编译SQL就是数据库提前把SQL语句编译成二进制,这样反复执行该语句的效率就会提升
- SQL语句预编译的过程中,关键字已经被解析了,所以传入的参数都会被当做字符串处理,这样能够抵御SQL注入攻击
username="1 OR 1=1"
password="1 OR 1=1"
sql="SELECT COUNT(*) FROM user WHERE username=%s AND password=%s"
cursor.execute(sql,(username,password)) #传入的参数是元组
print(cursor.fetchone()[0])
异常处理
- 数据库连接出错,或者语句执行错误,能够及时回滚和关闭连接
try:
con = mysql.connector.connect(......)
[ con = con.start_transaction() ]
......
[ con.commit ]
except Exception as e:
[ if "con" in dir():
con.rollback() ]
print(e)
finally:
if "con" in dir():
con.close()
数据库连接池和异常处理结合使用
import mysql.connector.pooling
config = {
"host":"localhost",
"port":3306,
"user":"root",
"password":"123456",
"database":"demo"
}
try:
pool = mysql.connector.pooling.MySQLConnectionPool(
**config,
pool_size=10
)
con=pool.get_connection()
con.start_transaction()
cursor = con.cursor()
sql = "......"
cursor.execute(sql)
con.commit()
except Exception as e:
if "con" in dir():
con.rollback()
finally:
if "con" in dir():
con.close()