Python 操作 MySQL

  1. 常见类库安装
    1. MySQLdb
    2. PyMySQL
    3. mysql.connector
  2. 使用
  3. 连接
  4. 增删改
  5. 事务
  6. 查询
  7. 关闭连接
  8. pymysql.err.InterfaceError: (0, '')

常见类库安装

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" 转载请保留原文链接及作者。

目录