zoukankan      html  css  js  c++  java
  • Python学习—数据库篇之pymysql

    一、pymysql简介

    对于Python操作MySQL主要使用两种方式:

    • 原生模块 pymsql
    • ORM框架 SQLAchemy

    pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。

    二、简单使用

    # -*- coding:utf-8 -*-
    # author: cdc
    # date: 2019/3/18
    
    import pymysql
    
    # 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
    # 创建游标
    cursor = conn.cursor()
    #执行sql操作
    r = cursor.execute("insert into student(age,sex,class_no) values(16,'male',2)")
    # r为执行sql语句后受影响的行数
    print(r)
    # 提交,不然无法保存新建或者修改的数据
    conn.commit()
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()
    

     

    三、增删改查

     1 # -*- coding:utf-8 -*-
     2 # author: cdc
     3 # date: 2019/3/18
     4 
     5 import pymysql
     6 
     7 # 创建连接
     8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
     9 # 创建游标
    10 cursor = conn.cursor()
    11 
    12 # 增加一行数据
    13 cursor.execute("insert into tb1(name,part) values('cdc',1)")
    14 
    15 # 字符串拼接sql(禁止使用,会引起sql注入)
    16 inp_1 = ('cdcy',2,)
    17 sql = "insert into tb1(name,part) values('%s','%s')" % inp_1
    18 cursor.execute(sql)
    19 
    20 # 带参数插入数据(推荐使用)
    21 inp_2 = ('cdcx',2)
    22 cursor.execute("insert into tb1(name,part) values(%s,%s)",inp_2)
    23 
    24 
    25 # 增加多行数据
    26 lis = [('cdc1',2),
    27        ('cdc2',2),
    28        ('cdc3',2),
    29        ]
    30 cursor.executemany("insert into tb1(name,part) values(%s,%s)",lis)
    31 
    32 # 提交,不然无法保存新建或者修改的数据
    33 conn.commit()
    34 # 关闭游标
    35 cursor.close()
    36 # 关闭连接
    37 conn.close()
    插入数据

     1 # -*- coding:utf-8 -*-
     2 # author: cdc
     3 # date: 2019/3/18
     4 
     5 import pymysql
     6 
     7 # 创建连接
     8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
     9 # 创建游标
    10 cursor = conn.cursor()
    11 #执行sql操作
    12 r = cursor.execute("delete from tb1 where name=%s",('alex',))
    13 # r为执行sql语句后受影响的行数
    14 print(r)
    15 # 提交,不然无法保存新建或者修改的数据
    16 conn.commit()
    17 # 关闭游标
    18 cursor.close()
    19 # 关闭连接
    20 conn.close()
    View Code

     1 # -*- coding:utf-8 -*-
     2 # author: cdc
     3 # date: 2019/3/18
     4 
     5 import pymysql
     6 
     7 # 创建连接
     8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
     9 # 创建游标
    10 cursor = conn.cursor()
    11 #执行sql操作
    12 r = cursor.execute("update tb1 set name=%s where part=%s",('ccc',1,))
    13 # r为执行sql语句后受影响的行数
    14 print(r)
    15 # 提交,不然无法保存新建或者修改的数据
    16 conn.commit()
    17 # 关闭游标
    18 cursor.close()
    19 # 关闭连接
    20 conn.close()
    View Code

     

    查新操作时,不需要执行commit操作

     1 # -*- coding:utf-8 -*-
     2 # author: cdc
     3 # date: 2019/3/18
     4 
     5 import pymysql
     6 
     7 # 创建连接
     8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
     9 # 创建游标
    10 cursor = conn.cursor()
    11 # 查询数据
    12 cursor.execute('select * from tb3')
    13 
    14 # 展示一行
    15 result = cursor.fetchone()
    16 print(result)
    17 result = cursor.fetchone()
    18 print(result)
    19 
    20 # 展示多行
    21 result = cursor.fetchmany(3)
    22 print(result)
    23 
    24 # 展示全部
    25 result = cursor.fetchall()
    26 print(result)
    pymysql查询操作

    注意:fetch操作的机制类似于文件操作中的指针,会在上一次的展示基础位置上继续往下展示n行数据

     1 # -*- coding:utf-8 -*-
     2 # author: cdc
     3 # date: 2019/3/18
     4 
     5 import pymysql
     6 
     7 # 创建连接
     8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
     9 # 创建游标
    10 cursor = conn.cursor()
    11 # 查询数据
    12 cursor.execute('select * from tb3')
    13 
    14 # 展示一行
    15 result = cursor.fetchone()
    16 print(result)
    17 result = cursor.fetchone()
    18 print(result)
    19 
    20 # 展示多行
    21 result = cursor.fetchmany(3)
    22 print(result)
    23 
    24 
    25 # ******************** 执行结果 ***************
    26 """
    27 (1, 'cdc', 1)
    28 (2, 'ccc', 1)
    29 ((3, 'ctt', 3), (4, 'lj', 4), (5, 'xx', 5))
    30 """
    View Code

    fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

    • cursor.scroll(n,mode='relative')  # 相对当前位置移动,即从当前位置向前或者向后移动n个位置,再进行数据展示
    • cursor.scroll(n,mode='absolute') # 相对绝对位置移动,即从当前位置回到n位置后,再进行数据的展示
     1 # -*- coding:utf-8 -*-
     2 # author: cdc
     3 # date: 2019/3/18
     4 
     5 import pymysql
     6 
     7 # 创建连接
     8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
     9 # 创建游标
    10 cursor = conn.cursor()
    11 # 查询数据
    12 cursor.execute('select * from tb3')
    13 
    14 # 展示一行
    15 result = cursor.fetchone()
    16 print(result)
    17 result = cursor.fetchone()
    18 print(result)
    19 
    20 # 向前移动一个位置
    21 """
    22 (1, 'cdc', 1)
    23 (2, 'ccc', 1)
    24 (2, 'ccc', 1)
    25 """
    26 cursor.scroll(-1,mode='relative')
    27 
    28 # 向后移动一个位置
    29 """
    30 (1, 'cdc', 1)
    31 (2, 'ccc', 1)
    32 (4, 'lj', 4)
    33 
    34 """
    35 cursor.scroll(1,mode='relative')
    36 result = cursor.fetchone()
    37 print(result)
    View Code

    此外,fetch操作默认获取的数据是元祖类型,如果想要或者字典类型的数据,可以通过改变游标的方式实现:

     1 # -*- coding:utf-8 -*-
     2 # author: cdc
     3 # date: 2019/3/18
     4 
     5 import pymysql
     6 
     7 # 创建连接
     8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
     9 # 创建游标
    10 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    11 # 查询数据
    12 cursor.execute('select * from tb3')
    13 
    14 # 展示全部
    15 result = cursor.fetchall()
    16 print(result)
    17 
    18 # *********  执行结果 ************
    19 """
    20 [{'part_no': 1, 'name': 'cdc', 'no': 1}, {'part_no': 1, 'name': 'ccc', 'no': 2}, {'part_no': 3, 'name': 'ctt', 'no': 3}, {'part_no': 4, 'name': 'lj', 'no': 4}, {'part_no': 5, 'name': 'xx', 'no': 5}, {'part_no': 9, 'name': 'cc', 'no': 6}, {'part_no': 5, 'name': 'fdc', 'no': 7}]
    21 """
    View Code

     其他操作

     1 # 注:必须得有自增列
     2 
     3 import pymysql
     4 
     5 # 创建连接
     6 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8')
     7 # 创建游标
     8 cursor = conn.cursor()
     9 # 查询数据
    10 cursor.execute('insert into class(address) values(%s)',('class_3',))
    11 
    12 new_id = cursor.lastrowid
    13 print(new_id)
    获取最新自增ID
  • 相关阅读:
    AD域渗透总结
    CTF
    ew做代理 进一步内网渗透
    CVE-2019-0708复现
    win 内网frp反弹到内网liunx
    Liunx反弹shell的几种方式
    sql到python正则
    PHP面向对象学习-属性 类常量 类的自动加载 构造函数和析构函数 访问控制(可见性)
    PHP反序列化学习
    PHP面向对象学习
  • 原文地址:https://www.cnblogs.com/cdc1216/p/10549914.html
Copyright © 2011-2022 走看看