本篇对于Python操作MySQL主要使用两种方式:
- 原生模块 pymsql
- ORM框架 SQLAchemy
pymysql
下载安装
pip3 install pymysql #pip3命令的路径:安装路径下的Scripts目录 # 下载 pymysql到本地 # 解压到执行目录 # python2,默认无pip命令 # python3,默认自带pip3命令 python3 -m pip install --upgrade pip 更新pip #https://pypi.python.org/pypi 模块源
使用操作
1.执行sql语句
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 # 创建连接 6 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘,charset=‘utf8‘) 7 # 创建游标(创建连接只是打开了数据库,要想取数据需要通过游标来取) 8 cursor = conn.cursor() 9 10 # 执行SQL,并返回受收影响行数(即有一个返回值) 11 effect_row = cursor.execute("update hosts set host = ‘1.1.1.2‘") 12 cursor.execute("insert into class(caption) values(‘全栈二班‘)") 13 14 # 执行SQL,并返回受影响行数,插入多行使用executemany 15 #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) 16 effect_row = cursor.execute("delete from score where sid = 3") 17 18 inp = input("请输入IP地址") 19 cursor.execute("insert into hosts(host) values(%s)",inp)
20
21 cursor.execute("select * from student") #查询的数据从数据库中取出保存在内存中
22 result1 = cursor.fetchall()
23 print(result1) #输出查询的结果
24 result2 = cursor.fetchone()
25 print(result2) #输出查询的第一条结果
26 result3 = cursor.fetchmany(3)
27 print(result3) #输出查询的前n条结果
28 22 # 提交,不然无法保存新建或者修改的数据 23 conn.commit() 24 25 # 关闭游标 26 cursor.close() 27 # 关闭连接 28 conn.close()
2.获取查询数据
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘) 6 cursor = conn.cursor() 7 cursor.execute("select * from hosts") 8 9 # 获取第一行数据 10 row_1 = cursor.fetchone() 11 12 # 获取前n行数据 13 # row_2 = cursor.fetchmany(3) 14 # 获取所有数据 15 # row_3 = cursor.fetchall() 16 17 conn.commit() 18 cursor.close() 19 conn.close()
注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
-
- cursor.scroll(1,mode=‘relative‘) # 相对当前位置移动即指针相对当前位置往下走一个,负数表示往上走
- cursor.scroll(2,mode=‘absolute‘) # 相对绝对位置移动即指针回到第2个位置
3.sql注入
无需用户名和密码就可以实现对数据库进行插入操作
1 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘) 2 #正常应采用以下的方式,不会出现安全问题 3 cursor.execute(‘select username,password from userinfo where username=%s and password=%s‘,(‘alex‘,123)) 4 result = cursor.fetchone() 5 print(result) 6 7 #字符串拼接会出现安全问题 8 #可正常执行: 9 sql = ‘select username,password from userinfo where username="%s" and password="%s"‘ 10 sql = sql %(‘alex‘,123) 11 cursor.execute(sql) 12 result = cursor.fetchone() 13 print(result) 14 15 #不能执行 16 sql = ‘select username,password from userinfo where username="%s" and password="%s"‘
17 sql = sql %(‘alex‘,1236) 18 cursor.execute(sql) 19 result = cursor.fetchone() 20 print(result) 21 22 #可正常执行:即密码错误也能取到数据 23 sql = ‘select username,password from userinfo where username="%s" and password="%s"‘
24 sql = sql %(‘alex‘‘ -- ‘,1236) #‘select username,password from userinfo where username="alex‘‘ -- " and password="%s"‘ 后面的就注释掉
#sql = sql %(‘alex‘‘ or 1=1 -- ‘,1236) 即使不存在用户名也成立即命令也能执行 25 cursor.execute(sql) 26 result = cursor.fetchone() 27 print(result)
4.fetch数据类型
关于默认获取的数据是元祖类型,如果想要获取字典类型的数据,即:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘) 6 7 # 游标设置为字典类型 8 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) 9
10 11 result = cursor.fetchone() 12 13 conn.commit() 14 cursor.close() 15 conn.close()
5.获取新创建数据自增ID
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘) 6 cursor = conn.cursor() 7 cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) 8 conn.commit() 9 cursor.close() 10 conn.close() 11 12 # 获取最新自增ID 13 new_id = cursor.lastrowid