python使用pymysql实现操作mysql


Posted in Python onSeptember 13, 2016

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

适用环境

python版本 >=2.6或3.3

mysql版本>=4.1

安装

可以使用pip安装也可以手动下载安装。

使用pip安装,在命令行执行如下命令:

pip install PyMySQL

手动安装,请先下载。下载地址:https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X。

其中的X.X是版本(目前可以获取的最新版本是0.6.6)。

下载后解压压缩包。在命令行中进入解压后的目录,执行如下的指令:

python setup.py install

建议使用pip安装。

使用示例

连接数据库如下:

import pymysql.cursors
 
# Connect to the database
connection = pymysql.connect(host='127.0.0.1',
               port=3306,
               user='root',
               password='zhyea.com',
               db='employees',
               charset='utf8mb4',
               cursorclass=pymysql.cursors.DictCursor)

也可以使用字典进行连接参数的管理,我觉得这样子更优雅一些:

import pymysql.cursors
 
config = {
     'host':'127.0.0.1',
     'port':3306,
     'user':'root',
     'password':'zhyea.com',
     'db':'employees',
     'charset':'utf8mb4',
     'cursorclass':pymysql.cursors.DictCursor,
     }
 
# Connect to the database
connection = pymysql.connect(**config)

插入数据:

执行sql语句前需要获取cursor,因为配置默认自动提交,故在执行sql语句后需要主动commit,最后不要忘记关闭连接:

from datetime import date, datetime, timedelta
import pymysql.cursors
 
#连接配置信息
config = {
     'host':'127.0.0.1',
     'port':3306,
     'user':'root',
     'password':'zhyea.com',
     'db':'employees',
     'charset':'utf8mb4',
     'cursorclass':pymysql.cursors.DictCursor,
     }
# 创建连接
connection = pymysql.connect(**config)
 
# 获取明天的时间
tomorrow = datetime.now().date() + timedelta(days=1)
 
# 执行sql语句
try:
  with connection.cursor() as cursor:
    # 执行sql语句,插入记录
    sql = 'INSERT INTO employees (first_name, last_name, hire_date, gender, birth_date) VALUES (%s, %s, %s, %s, %s)'
    cursor.execute(sql, ('Robin', 'Zhyea', tomorrow, 'M', date(1989, 6, 14)));
  # 没有设置默认自动提交,需要主动提交,以保存所执行的语句
  connection.commit()
 
finally:
  connection.close();

执行查询:

import datetime
import pymysql.cursors
 
#连接配置信息
config = {
     'host':'127.0.0.1',
     'port':3306,
     'user':'root',
     'password':'zhyea.com',
     'db':'employees',
     'charset':'utf8mb4',
     'cursorclass':pymysql.cursors.DictCursor,
     }
# 创建连接
connection = pymysql.connect(**config)
 
# 获取雇佣日期
hire_start = datetime.date(1999, 1, 1)
hire_end = datetime.date(2016, 12, 31)
 
# 执行sql语句
try:
  with connection.cursor() as cursor:
    # 执行sql语句,进行查询
    sql = 'SELECT first_name, last_name, hire_date FROM employees WHERE hire_date BETWEEN %s AND %s'
    cursor.execute(sql, (hire_start, hire_end))
    # 获取查询结果
    result = cursor.fetchone()
    print(result)
  # 没有设置默认自动提交,需要主动提交,以保存所执行的语句
  connection.commit()
 
finally:
  connection.close();

这里的查询支取了一条查询结果,查询结果以字典的形式返回:

从结果集中获取指定数目的记录,可以使用fetchmany方法:

result = cursor.fetchmany(2)

不过不建议这样使用,最好在sql语句中设置查询的记录总数。

获取全部结果集可以使用fetchall方法:

result = cursor.fetchall()

因为只有两条记录,所以上面提到的这两种查询方式查到的结果是一样的:

[{'last_name': 'Vanderkelen', 'hire_date': datetime.date(2015, 8, 12), 'first_name': 'Geert'}, {'last_name': 'Zhyea', 'hire_date': datetime.date(2015, 8, 21), 'first_name': 'Robin'}]

在django中使用

在django中使用是我找这个的最初目的。目前同时支持python3.4、django1.8的数据库backend并不好找。这个是我目前找到的最好用的。

设置DATABASES和官方推荐使用的MySQLdb的设置没什么区别:

DATABASES = {
   'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mytest',
        'USER': 'root',
        'PASSWORD': 'zhyea.com',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
 

关键是这里:我们还需要在站点的__init__.py文件中添加如下的内容:

import pymysql
pymysql.install_as_MySQLdb()

最后给大家附上pymysql实现增删改查的代码,希望大家能够喜欢

#!/usr/bin/python
#coding:gbk
import pymysql
from builtins import int

#将MysqlHelper的几个函数写出来

def connDB():               #连接数据库
  conn=pymysql.connect(host="localhost",user="root",passwd="zx69728537",db="student");
  cur=conn.cursor();
  return (conn,cur);

def exeUpdate(conn,cur,sql):        #更新或插入操作
  sta=cur.execute(sql);
  conn.commit();
  return (sta);

def exeDelete(conn,cur,IDs):        #删除操作
  sta=0;
  for eachID in IDs.split(' '):
    sta+=cur.execute("delete from students where Id=%d"%(int(eachID)));
  conn.commit();
  return (sta);
    
def exeQuery(cur,sql):           #查找操作
  cur.execute(sql);
  return (cur);
  
def connClose(conn,cur):          #关闭连接,释放资源
  cur.close();
  conn.close();

result=True;
print("请选择以上四个操作:1、修改记录,2、增加记录,3、查询记录,4、删除记录.(按q为退出)");
conn,cur=connDB();
number=input();
while(result):
  if(number=='q'):
    print("结束操作");
    break;
  elif(int(number)==1):
    sql=input("请输入更新语句:");
    try:
      exeUpdate(conn, cur, sql);
      print("更新成功");
    except Exception:
      print("更新失败");
      raise;
  elif(int(number)==2):
      sql=input("请输入新增语句:");
      try:
        exeUpdate(conn, cur, sql);
        print("新增成功");
      except Exception:
        print("新增失败");
        raise;
  elif(int(number)==3):
    sql=input("请输入查询语句:");
    try:
      cur=exeQuery(cur, sql);
      for item in cur:
        print("Id="+str(item[0])+" name="+item[1]);
    except Exception:
      print("查询出错");
      raise;
  elif(int(number)==4):
    Ids=input("请输入Id,并用空格隔开");
    try:
      exeDelete(conn, cur, Ids);
      print("删除成功");
    except Exception:
      print("删除失败");
      raise;
  else:
    print("非法输入,将结束操作!");
    result=False;
    break;
  print("请选择以上四个操作:1、修改记录,2、增加记录,3、查询记录,4、删除记录.(按q为退出)");
  number=input("请选择操作");
Python 相关文章推荐
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
python调用Matplotlib绘制分布点图
Oct 18 Python
Python numpy线性代数用法实例解析
Nov 15 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
Python2与Python3的区别详解
Feb 09 Python
python实现猜单词游戏
May 22 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
实例讲解Python中sys.argv[]的用法
Jun 03 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 Python
python实现可以断点续传和并发的ftp程序
Sep 13 #Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 #Python
Python中操作mysql的pymysql模块详解
Sep 13 #Python
python常用函数详解
Sep 13 #Python
python如何查看系统网络流量的信息
Sep 12 #Python
Python爬取三国演义的实现方法
Sep 12 #Python
python 读写、创建 文件的方法(必看)
Sep 12 #Python
You might like
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
js宝典学习笔记(上)
2007/01/10 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python max内置函数详细介绍
2016/11/17 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
python的concat等多种用法详解
2018/11/28 Python
python中partial()基础用法说明
2018/12/30 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
CAD制图人员的自荐信
2014/02/07 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
农行心得体会
2014/09/02 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
学生会招新宣传语
2015/07/13 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
python元组打包和解包过程详解
2021/08/02 Python
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL