zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【java】定时任务@Scheduled
    20180513 实参 形参 数组
    20180513 实参 形参
    20180513 数组 实参 形参
    <转载>二维数组回形遍历
    20180318 代码错题(8)
    20180318 代码错题(7)
    20180318 代码错题(6)
    20180318 代码错题(5)
    20180318 bit置0
  • 原文地址:https://www.cnblogs.com/lriwu/p/8464910.html
Copyright © 2011-2022 走看看