用 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 paramiko实现ssh远程访问的方法
Dec 03 Python
Python实现类继承实例
Jul 04 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
简介Django框架中可使用的各类缓存
Jul 23 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
启动Atom并运行python文件的步骤
Nov 09 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
django解决跨域请求的问题详解
Jan 20 Python
详解Python3 pickle模块用法
Sep 16 Python
python基于socket函数实现端口扫描
May 28 Python
重构Python代码的六个实例
Nov 25 Python
Python如何加载模型并查看网络
Jul 15 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中的 == 运算符进行字符串比较
2006/11/26 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
Python比较两个图片相似度的方法
2015/03/13 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
Cocopanda波兰:购买化妆品、护肤品、护发和香水
2020/05/25 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
理工大学毕业生自荐信
2013/11/01 职场文书
毕业学生推荐信
2013/12/01 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
合作合同协议书
2016/03/21 职场文书
MySQL查询日期时间
2022/05/15 MySQL