Python 操作 MySQL
常见类库安装
MySQLdb
只支持 Python2,windows 版本下载地址 http://sourceforge.net/projects/mysql-python ,或使用 pip install MySQL-python
安装。
PyMySQL
pip install PyMysql
mysql.connector
pip install mysql-connector
使用
PyMySQL,mysql.connector,使用方式类似
import pymysql
import mysql.connector
连接
# pymysql port 必须是整数类型
conn = mysql.connector.connect(host="127.0.0.1", port=3306, user="root", password="123456", database="test")
# 使用cursor()方法获取操作游标
cursor = conn.cursor()
增删改
# 使用execute方法执行SQL语句
cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
# 使用executemany方法 插入多条语句
names = (('Geert', info, 30), ('Jan', info, 31), ('Michel', info, 32))
stmt_insert = "INSERT INTO names (name, info, age) VALUES (%s, %s, %s)"
cursor.executemany(stmt_insert, names)
# 影响行数
cursor.rowcount
# 获得自增id,多条时返回第一个,pymysql 使用 cursor.lastrowid
cursor._last_insert_id
%s
是 MySQL 的 SQL 占位符,实际参数可以接受多种类型,例如二进制类型 open("2.jpg", 'rb').read()
。
插入操作必须提交事务。
事务
# 提交事务
conn.commit()
# 自动提交事务,mysql.connector 报错 TypeError: 'bool' object is not callable
conn.autocommit(True)
# 回滚
conn.rollback()
查询
cursor.execute('select * from user where name = %s', ('z',))
values = cursor.fetchall()
print(values) # [('1', 'z'), ('2', 'z')]
for row in values:
id = row[0]
name = row[1]
# 打印结果
print "id=%s,name=%s" % (id, name )
# 获取下一个查询结果集
cursor.execute("select * from user")
values = c.fetchone()
print(values) # ('1', 'z')
values = c.fetchone()
print(values) # ('2', 'z')
关闭连接
# 关闭 Cursor 和 Connection
cursor.close() # True
conn.close()
pymysql.err.InterfaceError: (0, '')
这个错是在多线程下或 MySQL 断线需要重新连接。
try:
conn.ping(reconnect=True) # 如果发现断线会自动重连,可不加 reconnect=True 默认就是。
except:
logging.error(traceback.format_exc())
多线程情况下,建议使用数据库连接池 DBUtils,安装 pip install DButils
。
from DBUtils.PooledDB import PooledDB
pool = PooledDB(pymysql,1,host=mysql_ip,user=mysql_username,passwd=mysql_password,db=db,port=int(mysql_port),charset="utf8") # 第二个参数为连接池里的最少连接数
def fetchall(sql, *parameters):
"""得到全部列表"""
conn = pool.connection()
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
try:
i = cursor.execute(sql, *parameters)
returnData = cursor.fetchall()
return returnData
except (Exception) as e:
logging.info(e)
logging.info(sql)
finally:
cursor.close()
conn.close()
def execute(sql, *parameters):
"""执行数据更新、插入"""
i = -1
conn = pool.connection()
# conn.autocommit(1)
cursor = conn.cursor()
try:
i = cursor.execute(sql, *parameters)
conn.commit()
except (Exception) as e:
logging.info(e)
logging.info(sql)
logging.info(*parameters)
finally:
cursor.close()
conn.close()
return i
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:Python 操作 MySQL
文章字数:620
本文作者:Bin
发布时间:2018-09-06, 16:06:22
最后更新:2019-08-06, 00:07:35
原始链接:http://coolview.github.io/2018/09/06/Python/Python%20%E6%93%8D%E4%BD%9CMySQL/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。