mysql数据库创建连接:
1.
import mysql.connector con = mysql.connector.connect( host="localhost",port="3306", user="root",password="123456", database="demo" )
2.
import mysql.connector
config = {
"host":"localhost",
"port":3306,
"user":root,
"password":123456,
"database":demo
}
con = mysql.connector.connect(**config)
游标cursor:
mysql connector里面的游标用来执行SQL语句,而且查询的结果集也会保存在游标之中
cursor = con.cursor() cursor.execute(sql语句)
注入攻击:
由于SQL语言是解释性语言,所以在拼接SQL语句的时候,容易被注入恶意的SQL语句。
id = "1 or 1=1" sql = "delete from t_news where id="+id;
使用SQL的预编译机制抵御注入攻击:
预编译SQL就是数据库提前把SQL语句编译成二进制,这样反复执行同一条SQL语句的效率就会提升。
SQL语句编译的过程中,关键字已经被解析过了,所以向编译后的SQL语句传入参数,都被当做字符串处理,数据库不会解析其中注入的SQL语句
id = "1 or 1=1" sql = "delete from t_news where id=%s";#这样一来传入的id就只是一个字符串,不会被预解析和编译了
cursor.execute(sql,id);
SQL connector的异常处理:
import mysql.connector try: con = mysql.connector.connect( host="localhost", port=3306, user="root", password="123456", database="demo" ) con.start_transaction() cursor=con.cursor() sql="insert into t_emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)"\ "value(%s,%s,%s,%s,%s,%s,%s,%s)" cursor.execute(sql,(9600,"CIA","SALEMAN",None,"1985-12-1",2500,None,10)) con.commit() except Exception as e: if "con" in dir(): con.rollback() print(e) finally: if "con" in dir(): con.close()
数据库连接的昂贵之处:
数据库连接是一种关键的,有限的,昂贵的资源,在并发执行的应用程序中体现得尤为突出。
应用程序通过TCP协议与数据库连接,进行三次握手,四次挥手,数据库验证用户信息
这时候不断创建链接数据库就成为一种资源的占用,可以使用数据库连接池来代替:
数据库连接池预先创建出一些数据库连接,然后缓存起来,避免了程序语言反复创建和销毁连接的昂贵代价
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 = "update t_emp set sal=sal+%s where deptno=%s" cursor.execute(sql,(200,20)) con.commit() except Exception as e: if "con" in dir(): con.rollback() print(e)
游标对象的executemany()函数可以反复执行一条SQL语句:
sql = "insert into t_dept(deptno,dname,loc) values(%s,%s,%s)" data=[[100,"A部门","北京"],[110,"B部门","上海"]] cursor.executemany(sql,data)