MySQL与python交互

 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)

 

上一篇:详解tomcat的连接数与线程池


下一篇:【异常】com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connectio