一.简介

  pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同,但目前pymysql支持python3.x而后者不支持3.x版本

  其执行语句与sql源码相似

二.使用

1.安装

  pip install pymysql

2.使用操作

  先来一例完整的连接加基本的操作

  1. import pymysql
  2.  
  3. # 创建连接
  4. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  5. #第二种创建连接方式
  6. #连接配置信息
  7. config = {
  8. 'host':'127.0.0.1',
  9. 'port':3306,
  10. 'user':'root',
  11. 'password':'',
  12. 'db':'t1',
  13. 'charset':'utf8mb4',
  14. 'cursorclass':pymysql.cursors.DictCursor,
  15. }
  16. # 创建连接 (2)
  17. connection = pymysql.connect(**config)
  18.  
  19. # 创建游标
  20. cursor = conn.cursor()
  21.  
  22. # 执行SQL,并返回收影响行数
  23. effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
  24.  
  25. # 执行SQL,并返回受影响行数
  26. #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
  27.  
  28. # 执行SQL,并返回受影响行数
  29. #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  30.  
  31. # 提交,不然无法保存新建或者修改的数据
  32. conn.commit()
  33.  
  34. # 关闭游标
  35. cursor.close()
  36. # 关闭连接
  37. conn.close()

向数据库插入数据,使用try语句,当出现异常是主动回滚

  1. #!/usr/bin/python3
  2.  
  3. import pymysql
  4.  
  5. # 打开数据库连接
  6. db = pymysql.connect("localhost","testuser","test123","TESTDB" )
  7.  
  8. # 使用cursor()方法获取操作游标
  9. cursor = db.cursor()
  10.  
  11. # SQL 插入语句
  12. sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
  13. LAST_NAME, AGE, SEX, INCOME)
  14. VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
  15. try:
  16. # 执行sql语句
  17. cursor.execute(sql)
  18. # 提交到数据库执行
  19. db.commit()
  20. except:
  21. # 如果发生错误则回滚
  22. db.rollback()
  23.  
  24. # 关闭数据库连接
  25. db.close()

3.向数据表中插入多条数据,使用executemany方法,在生产环境中插入多条数据 ,在后台中获取数据后,以列表的形式传入语句([('v1','v2'),('v3','v4')])

  1. # 创建连接
  2. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  3. # 创建游标
  4. cur = conn.cursor()
  5. if request.method == "POST":
  6. title = request.POST.get("title")
  7. title_en = request.POST.get("title_en")
  8. content = request.POST.get("content")
  9. content_en = request.POST.get("content_en")
  10. notification_type =request.POST.get("notification_type").strip()
  11. user_list = request.POST.get("user_list")
  12. updated_datetime = datetime.now()
  13. created_datetime = datetime.now()
  14. values_list = []
  15. for user in user_id_list:
  16. temp = updated_datetime,created_datetime,title,title_en,content,content_en,notification_type,user['id']
  17. values_list.append((temp))
         try:
  18.   cur.executemany('''insert into app_notification(updated_datetime, created_datetime, title, title_en,
  19. content, content_en, notification_type, is_read, recipient_id)
  20. values(%s, %s, %s, %s, %s, %s, %s, 0, %s)''',values_list)
  21. conn.commit()
  22. conn.close()
         
  1.     except Exception as err:
        conn.rollback()
        logging.error(err)
        logging.error(traceback.format_exc())
        conn.close()
# 获取最新自增ID
  new_id = cursor.lastrowid

4.数据库查询操作

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

  • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
  • fetchall(): 接收全部的返回结果行.
  • rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
  1. import pymysql
  2.  
  3. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  4. cursor = conn.cursor()
  5. cursor.execute("select * from hosts")
  6.  
  7. # 获取第一行数据
  8. row_1 = cursor.fetchone()
  9.  
  10. # 获取前n行数据
  11. # row_2 = cursor.fetchmany(3)
  12. # 获取所有数据
  13. # row_3 = cursor.fetchall()
  14.  
  15. conn.commit()
  16. cursor.close()
  17. conn.close()

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

  • cursor.scroll(1,mode='relative')  # 相对当前位置移动
  • cursor.scroll(2,mode='absolute') # 相对绝对位置移动

5。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='', db='t1')
  6.  
  7. # 游标设置为字典类型
  8. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  9. r = cursor.execute("call p1()")
  10.  
  11. result = cursor.fetchone()
  12.  
  13. conn.commit()
  14. cursor.close()
  15. conn.close()

错误处理

DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常:

异常 描述
Warning 当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
Error 警告以外所有其他错误类。必须是 StandardError 的子类。
InterfaceError 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。
DatabaseError 和数据库有关的错误发生时触发。 必须是Error的子类。
DataError 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。
OperationalError 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。
IntegrityError 完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。
InternalError 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。
ProgrammingError 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。

pymysql 操作数据库的更多相关文章

  1. Python学习(二十九)—— pymysql操作数据库优化

    转载自:http://www.cnblogs.com/liwenzhou/articles/8283687.html 我们之前使用pymysql操作数据库的操作都是写死在视图函数中的,并且很多都是重复 ...

  2. pymysql操作数据库、索引、慢日志管理

    目录 pymysql操作数据库 简单操作 sql的注入问题 sql注入问题解决办法 sql注入问题模板总结 利用pymysql操作数据库 (增删改),conn.commit() 索引 1.为何要有索引 ...

  3. Python使用PyMysql操作数据库

    安装 pip install -U pymysql 连接数据库 连接数据库有两种不同的格式 直接使用参数 代码如下 import pymysql.cursors connection = pymysq ...

  4. 使用pymysql操作数据库

    学习如何使用python的pymysql模块来操作mysql数据库 这里的基本用法主要借鉴了该篇博客:https://www.cnblogs.com/woider/p/5926744.html 因为这 ...

  5. 用pymysql操作数据库

    import pymysql # 打开数据库连接 connection = pymysql.connect(host='127.0.0.1', user='root', passwd=', db='s ...

  6. MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05

    目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操 ...

  7. Python3使用PyMySQL操作数据库

    1. 安装PyMySQL pip install PyMySQL 关于PyMySQL的详细内容可以查看官方文档  Github 2. 创建表 在某个数据库内,使用以下指令建表 CREATE TABLE ...

  8. pymysql操作数据库

    pymysql.connect()参数说明:(连接数据库时需要添加的参数)host(str): MySQL服务器地址port(int): MySQL服务器端口号user(str): 用户名passwd ...

  9. python(pymysql操作数据库)

    第一种方式 import pymysql # 打开数据库连接 db = pymysql.connect(host="192.168.88.11", user="root& ...

随机推荐

  1. CSS3伸缩布局Flex学习笔记

    如果需要使用伸缩布局首先得把display:flex;对于兼容还得加前缀display:-webkit-display:flex;等其他浏览器前缀,但我本机Chrome测试已经不需要加前缀了,其实这些 ...

  2. Zookeeper-Zookeeper启动过程

    在上一篇,我们了解了zookeeper最基本的配置,也从中了解一些配置的作用,那么这篇文章中,我们将介绍Zookeeper的启动过程,我们在了解启动过程的时候还要回过头看看上一篇中各个配置参数在启动时 ...

  3. 哈夫曼树(三)之 Java详解

    前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

  4. JavaWeb:Web与HTTP协议简介

    JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...

  5. AndroidManifest.xml配置文件

    AndroidManifest.xml启动文件 主activity: <activity android:name="com.example.android01.MainActivit ...

  6. 简单的Linq笔记

    最近带一个新人,被问到Linq的一点东西,回答他后,自己记录下,防止自己懵逼. Linq中查询一个表中指定的几个字段: var ts = t.FindAllItems().Where(P => ...

  7. nodejs学习篇 (1)webstorm创建nodejs + express + jade 的web 项目

    之前简单了解过nodejs,觉得用nodejs来做个网站也太麻烦了,要自己拼html的字符串返回,这能做网站嘛? 最近看到使用jade模板来开发,觉得挺新奇的,于是试了一把,也了解了一些特性,算是个新 ...

  8. [Core] .NET Core & VS Code 之路(1) Hello World

    目录 相关链接 dotnet命令 VS Code Hello World Web Hello World 总结 其实本篇上个月已经写好, 只是 但是,不忘初心方得始终 相关链接 Learn .NET ...

  9. IHTMLDocument2

    {IHTMLDocument2 方法:} write //写入 writeln //写入并换行 open //打开一个流,以收集 document.write 或 document.writeln 的 ...

  10. 【转载】那些年我们一起清除过的浮动demo

    返回文章:那些年我们一起清除过的浮动 闭合浮动 与 清除浮动 的区别 .main:很抱歉,现代浏览器中我没能把warp撑高(float:left) .side:我也浮动了(float:left) .f ...