用 Python 连接 MySQL 的几种方式详解


Posted in Python onApril 04, 2018

尽管很多 NoSQL 数据库近几年大放异彩,但是像 MySQL 这样的关系型数据库依然是互联网的主流数据库之一,每个学 Python 的都有必要学好一门数据库,不管你是做数据分析,还是网络爬虫,Web 开发、亦或是机器学习,你都离不开要和数据库打交道,而 MySQL 又是最流行的一种数据库,这篇文章介绍 Python 操作 MySQL 的几种方式,你可以在实际开发过程中根据实际情况合理选择。

1、MySQL-python

MySQL-python 又叫 MySQLdb,是 Python 连接 MySQL 最流行的一个驱动,很多框架都也是基于此库进行开发,遗憾的是它只支持 Python2.x,而且安装的时候有很多前置条件,因为它是基于C开发的库,在 Windows 平台安装非常不友好,经常出现失败的情况,现在基本不推荐使用,取代的是它的衍生版本。

# 前置条件
sudo apt-get install python-dev libmysqlclient-dev # Ubuntu
sudo yum install python-devel mysql-devel # Red Hat / CentOS
# 安装
pip install MySQL-python

Windows 直接通过下载 exe 文件安装,公众号回复「win」获取下载链接

#!/usr/bin/python
import MySQLdb
db = MySQLdb.connect(
   host="localhost",  # 主机名
   user="john",     # 用户名
   passwd="megajonhy", # 密码
   db="jonhydb")    # 数据库名称
# 查询前,必须先获取游标
cur = db.cursor()
# 执行的都是原生SQL语句
cur.execute("SELECT * FROM YOUR_TABLE_NAME")
for row in cur.fetchall():
  print(row[0])
db.close()

2、mysqlclient

由于 MySQL-python 年久失修,后来出现了它的 Fork 版本 mysqlclient,完全兼容 MySQLdb,同时支持 Python3.x,是 Django ORM的依赖工具,如果你想使用原生 SQL 来操作数据库,那么推荐此驱动。安装方式和 MySQLdb 是一样的,Windows 可以在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 网站找到 对应版本的 whl 包下载安装。

用 Python 连接 MySQL 的几种方式详解

# Windows安装
pip install some-package.whl
# linux 前置条件
sudo apt-get install python3-dev # debian / Ubuntu
sudo yum install python3-devel # Red Hat / CentOS
brew install mysql-connector-c # macOS (Homebrew)
pip install mysqlclient

3、PyMySQL

PyMySQL 是纯 Python 实现的驱动,速度上比不上 MySQLdb,最大的特点可能就是它的安装方式没那么繁琐,同时也兼容 MySQL-python

pip install PyMySQL
# 为了兼容mysqldb,只需要加入
pymysql.install_as_MySQLdb()

一个例子

import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', passwd="xxx", db='mysql')
cur = conn.cursor()
cur.execute("SELECT Host,User FROM user")
for r in cur:
  print(r)
cur.close()
conn.close()

4、peewee

写原生 SQL 的过程非常繁琐,代码重复,没有面向对象思维,继而诞生了很多封装 wrapper 包和 ORM 框架,ORM 是 Python 对象与数据库关系表的一种映射关系,有了 ORM 你不再需要写 SQL 语句。提高了写代码的速度,同时兼容多种数据库系统,如sqlite, mysql、postgresql,付出的代价可能就是性能上的一些损失。如果你对 Django 自带的 ORM 熟悉的话,那么 peewee的学习成本几乎为零。它是 Python 中是最流行的 ORM 框架。

pip install peewee

一个例子

import peewee
from peewee import *
db = MySQLDatabase('jonhydb', user='john', passwd='megajonhy')
class Book(peewee.Model):
  author = peewee.CharField()
  title = peewee.TextField()
  class Meta:
    database = db
Book.create_table()
book = Book(author="me", title='Peewee is cool')
book.save()
for book in Book.filter(author="me"):
  print(book.title)

官方文档:http://docs.peewee-orm.com/en/latest/peewee/installation.html

5、SQLAlchemy

如果想找一种既支持原生 SQL,又支持 ORM 的工具,那么 SQLAlchemy 是最好的选择,它非常接近 Java 中的 Hibernate 框架。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy_declarative import Address, Base, Person
class Address(Base):
  __tablename__ = 'address'
  id = Column(Integer, primary_key=True)
  street_name = Column(String(250))
engine = create_engine('sqlite:///sqlalchemy_example.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
# Insert a Person in the person table
new_person = Person(name='new person')
session.add(new_person)
session.commit()

现在差不多搞明白了这几种数据库驱动的优劣,接下来你就可以选择其中的一个进行系统的学习再把它应用到项目中去了,祝你学习开心,不懂的可以咨询我哈。

总结

以上所述是小编给大家介绍的用 Python 连接 MySQL 的几种姿势详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python实现批量转换文件编码(批转换编码示例)
Jan 23 Python
横向对比分析Python解析XML的四种方式
Mar 30 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
利用Python实现网络测试的脚本分享
May 26 Python
pandas string转dataframe的方法
Apr 11 Python
python学习基础之循环import及import过程
Apr 22 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
Pandas之缺失数据的实现
Jan 06 Python
python绘制汉诺塔
Mar 01 Python
Python进行区间取值案例讲解
Aug 02 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 #Python
对numpy中数组元素的统一赋值实例
Apr 04 #Python
Python 元类实例解析
Apr 04 #Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 #Python
Numpy数组的保存与读取方法
Apr 04 #Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 #Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 #Python
You might like
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
javascript jQuery插件练习
2008/12/24 Javascript
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
JavaScript & jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
基于python编写的微博应用
2014/10/17 Python
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
解决Python一行输出不显示的问题
2018/12/03 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
python实现XML解析的方法解析
2019/11/16 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
幼儿园大班教学反思
2014/02/10 职场文书
司法建议书范文
2014/05/13 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
房产协议书范本
2014/10/18 职场文书
质量保证书格式
2015/02/27 职场文书
行政经理岗位职责
2015/04/15 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
创业计划书之便利店
2019/09/05 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书