三种驱动mysql.connector、PyMySQL、mysqldb使用和比较
mysql-connector-python
此为廖雪峰老师教程中所用驱动,为python官方驱动。安装命令:
pip install mysql-connector-python --allow-external mysql-connector-python
或者
pip install mysql-connector
使用mysql.connector访问数据库:
import mysql.connector
# password设为mysql的root口令
conn = mysql.connector.connect(user='root', password='password', database='test')
cursor = conn.cursor()
# 创建user表
cursor.execute('要执行的sql语句')
# 提交事务
conn.commit()
# 关闭Cursor和Connection:
cursor.close()
conn.close()
PyMySQL 驱动
PyMySQL仅限于 Python3.x 版本中连接 MySQL 。
- 安装命令:
pip3 install PyMySQL
若pip安装失败,可使用git命令或者手动下载源安装包后,进入工程目录使用python命令手动安装:
cd PyMySQL/
python3 setup.py install
- 使用PyMySQL访问数据库-建表:
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# 关闭数据库连接
db.close()
- 使用PyMySQL访问数据库-插入、更新、删除数据:
注意事务提交以及错误回滚处理
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
# 此处可将sql换为update、delete等语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', %s, '%s', %s)" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# 执行sql语句
cursor.execute(sql)
# 执行sql语句
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()
- 使用PyMySQL访问数据库-查询:
可使用fetchall()等方法对查询结果进行获取和进一步处理,见代码中注释
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 查询语句
sql_query = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (1000)
try:
# 执行SQL语句
cursor.execute(sql_query)
# fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
# fetchall(): 接收全部的返回结果行.
# rowcount: 这是一个只读属性,并非方法,直接返回执行execute()方法后影响的行数。
results = cursor.fetchall()
for row in results:
pass
except:
print ("Error: unable to fetch data")
# 关闭数据库连接
db.close()
MySQLdb驱动
仅支持linux的python2.x版本。用法同上类似,安装:
pip install MySQLdb
比较和总结
- mysql.connector作为官方版本,在Python中重新实现MySQL协议,速度相对最慢,但因为不依赖其它库,因此最便携;
- PyMySQL 限制于Python3.x 版本;
- MySQLdb限制于Python2.x 版本,且不支持windows。
因此推荐使用PyMySQL。
SSH连接Mysql
基于pymysql与sshtunnel,实现mysql跳转连接,用于服务器无法直接本地连接的场景。即:在本地(记为地址A),通过SSH中间服务器B,连接远程MYSQL服务器C。
下述代码中地址及端口,根据实际网络策略进行配置:
from pymysql import connect
from sshtunnel import SSHTunnelForwarder
# 指定SSH远程跳转
server = SSHTunnelForwarder(ssh_address_or_host=('IP地址B', B端口号), # 指定SSH中间登录地址和端口号
ssh_username='user_name_b', # 指定地址B的SSH登录用户名
ssh_password='pwd_b', # 指定地址B的SSH登录密码
local_bind_address=('127.0.0.1', A端口号), # 绑定本地地址A(默认127.0.0.1)及与B相通的端口(根据网络策略配置,若端口全放,则此行无需配置,使用默认即可)
remote_bind_address=('IP地址C', 3306) # 指定最终目标C地址,端口号为mysql默认端口号3306
)
server.start()
# 打印本地端口,以检查是否配置正确
print(server.local_bind_port)
# 设置mysql连接参数,地址与端口均必须设置为本地地址与端口
# 用户名和密码以及数据库名根据自己的数据库进行配置
db = connect(host="127.0.0.1", port=server.local_bind_port, user="root", passwd="root_pwd", db="test_db")
cursor = db.cursor()
sql = "select COUNT(1) from table1"
try:
# 执行SQL语句检查是否连接成功
cursor.execute("SELECT VERSION()")
result = cursor.fetchone()
print("Database version : %s " % result)
#执行查询语句
cursor.execute(sql)
result = cursor.fetchone()
print("sql result : %s" % result)
except:
print("Error: unable to fetch data")
# 关闭连接
db.close()
server.close()