PyMySQL的连接
# 导入pymysql模块 import pymysql # 连接database conn = 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" # 连接database conn = 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" # 连接database conn = 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 pymysql username="老张" age="12" # 连接database conn = 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 pymysql username="老张" age="12" # 连接database conn = 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()
# 光标按绝对位置移动1 cur.scroll(1, mode="absolute") # 光标按照相对位置(当前位置)移动1 cur.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()