PyMySQL的连接
# 导入pymysql模块import pymysql# 连接databaseconn = pymysql.connect(host="你的数据库ip地址",port=端口号, user="用户名",password="密码",database="数据库名",charset="utf8")# 得到一个可以执行SQL语句的光标对象cur = conn.cursor()
# 得到一个可以执行SQL语句并且将结果作为字典返回的游标cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 定义要执行的SQL语句 """
sql = select/insert into /delete/update
""" # 执行SQL语句 cur.execute(sql) # 关闭光标对象 cur.close() # 关闭数据库连接 conn.close()
规避注入问题:
import pymysql# 获取用户输入username = input("输入用户名:")pwd = input("请输入密码:")# 连接数据库检索有没有该用户conn = pymysql.connect( host="localhost", port=3306, database="userinfo", user="root", password="123456", charset="utf8")cursor = conn.cursor() # 获取光标# 拼接要执行的SQL语句 (1)sql = 'select * from info where username=%s and password=%s'%(username, pwd) 在这种情况下,若用户输入注释(--)或者输入恒成立的字符串也同样会匹配成功 (2)sql = 'select * from info where username=%s and password=%s'
# 执行SQL语句 ret = cursor.execute(sql, [username, pwd]) # pymysql内部拼接并识别特殊字符if ret: print("登录成功")else: print("登录失败!")# 关闭光标对像cur.close()# 关闭连接conn.close()
增删改查
增加
# 导入pymysql模块import pymysql username="老张" age="12"# 连接databaseconn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)# 得到一个可以执行SQL语句的光标对象cur = conn.cursor() #增加数据sql = "INSERT INTO DB1(name, age) VALUES (%s, %s);"
# 执行SQL语句cur.execute(sql, [username, age])
# 提交事务conn.commit()cur.close()conn.close()
删除
# 导入pymysql模块import pymysql username="老张" age="12"# 连接databaseconn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)# 得到一个可以执行SQL语句的光标对象cur = conn.cursor()
#删除数据sql = "DELETE from DB1 WHERE name=%s"
# 执行SQL语句cur.execute(sql,"老张")
# 提交事务conn.commit()cur.close()conn.close()
更改
# 导入pymysql模块import pymysqlusername="老张"age="12"# 连接databaseconn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)# 得到一个可以执行SQL语句的光标对象cur = conn.cursor()#修改数据sql = "update db1 set name=%s where age=%s ;" # 执行SQL语句 cur.execute(sql, [username, age]) # 提交事务 conn.commit() cur.close() conn.close()
查询
# 导入pymysql模块import pymysqlusername="老张"age="12"# 连接databaseconn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)# 得到一个可以执行SQL语句的光标对象cur = conn.cursor()#查询数据sql = "select *from db1 ;" sq1 = "select name,sge from db1 where id=1"# 执行SQL语句 cur.execute(sql]) # 查询所有数据ret=cur.fetchall() #查询一条数据 ret=cur.fetchone() #查询指定条数数据 ret=cur.fetmany(2) cur.close() conn.close()
# 光标按绝对位置移动1cur.scroll(1, mode="absolute")# 光标按照相对位置(当前位置)移动1cur.scroll(1, mode="relative") 数字为正数向下移动,数字为负向上移动。
连接池
from DBUtils .PooledDB import PooledDB
POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数 mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5, # 链接池中最多闲置的链接,0和None不限制 maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always host='127.0.0.1', port=3306, user='root', password='123456', database='DB', charset='utf8' ) #连接数据库池 conn=POOL.connection()