python基础篇-python操作mysql

本篇对于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

 

posted @ 2018-02-24 22:25  lriwu  阅读(171)  评论(0编辑  收藏  举报