MySQL Connector
官方的驱动模块,兼容性好
创建连接
1、import mysql.connector
con=mysql.connector.connect(
host="localhost",port="3306",
user = 'root',password="abc1",
database="demo");
2、import mysql.connector
config={
"host":"localhost",
"port":3306,
"user" :'root',
"password":"abc1",
"database":"demo"};
con=mysql.connector.connect(**config)
利用游标来执行SQL语句,而查询的结果集也保存在游标中
cursor=con.cursor()
cursor.execute(sql语句)
SQL语句是解释型语言,拼接SQL语句的时候,容易被注入恶意的SQL语句。
SQL预编译机制
预编译就是将数据库提前把SQL语句编译成二进制,反复执行童一条SQL语句的效率就会提高。
SQL语句被编译后,传入参数都被当做字符串处理,数据库不会解释注入SQL语句。
防注入
sql="SELECT COUNT(*) FROM t_user WHERE username=%s AND AES_DECRYPT(UNHEX(password),‘helloword’)=%s";
cursor.execute(sql,(username,password));
print(cursor.fetchone()[0])
事务控制
con.start_transaction([事务的隔离级别])
con.commit()
con.rollback()
异常处理
try:
......
except Exception as e:
..[con.rollback()]
finally:
if "con" in dir():con.close()
数据库最昂贵的是数据库连接,并发尤为突出
TCP连接需要三次握手,四次回首,然后数据库还要验证用户信息。
数据库连接池:预先创建一些数据库连接,然后缓存,避免程序语言反复创建
import mysql.connector.pooling
config={...}
pool=mysql.connector.pooling.MySQLConnectionPool(**config,pool_size=10)
con=pool.get_connection()
EXECUTEMANY()函数可以反复执行一条SQL语句。
cursor.executemany(sql,data)
create table t_emp_new AS (select * from t_emp)复制数据表
create table t_emp_new like t_emp 复制数据表结构(内容空)
cursor.fetchall() 查出全部数据