Pymysql

来源: Shocker 链接:
https://shockerli.net/post/python3-pymysql/

PyMySQL 是一个纯 Python 实现的 MySQL 客户端操作库,支持事务、存储过程、批量执行等。

PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

安装

pip install PyMySQL

创建数据库连接

import pymysql
connection = pymysql.connect(host='localhost',
                             port=3306,
                             user='root',
                             password='root',
                             db='demo',
                             charset='utf8')

参数列表:

参数	描述
host	数据库服务器地址,默认 localhost
user	用户名,默认为当前程序运行用户
password	登录密码,默认为空字符串
database	默认操作的数据库
port	数据库端口,默认为 3306
bind_address	当客户端有多个网络接口时,指定连接到主机的接口。参数可以是主机名或IP地址。
unix_socket	unix 套接字地址,区别于 host 连接
read_timeout	读取数据超时时间,单位秒,默认无限制
write_timeout	写入数据超时时间,单位秒,默认无限制
charset	数据库编码
sql_mode	指定默认的 SQL_MODE
cursorclass	设置默认的游标类型
init_command	当连接建立完成之后执行的初始化 SQL 语句
connect_timeout	连接超时时间,默认 10,最小 1,最大 31536000
autocommit	是否自动提交,默认不自动提交,参数值为 None 表示以服务器为准
local_infile	Boolean to enable the use of LOAD DATA LOCAL command. (default: False)
max_allowed_packet	发送给服务器的最大数据量,默认为 16MB
defer_connect	是否惰性连接,默认为立即连接
db	参数 database 的别名
passwd	参数 password 的别名
binary_prefix	Add _binary prefix on bytes and bytearray. (default: False)

执行 SQL

cursor.execute(sql, args) 执行单条 SQL

# 获取游标
cursor = connection.cursor()

# 创建数据表
effect_row = cursor.execute('''
CREATE TABLE `users` (
  `name` varchar(32) NOT NULL,
  `age` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
''')

# 插入数据(元组或列表)
effect_row = cursor.execute('INSERT INTO `users` (`name`, `age`) VALUES (%s, %s)', ('mary', 18))

# 插入数据(字典)
info = {'name': 'fake', 'age': 15}
effect_row = cursor.execute('INSERT INTO `users` (`name`, `age`) VALUES (%(name)s, %(age)s)', info)

connection.commit()

executemany(sql, args) 批量执行 SQL

# 获取游标
cursor = connection.cursor()

# 批量插入
effect_row = cursor.executemany(
    'INSERT INTO `users` (`name`, `age`) VALUES (%s, %s) ON DUPLICATE KEY UPDATE age=VALUES(age)', [
        ('hello', 13),
        ('fake', 28),
    ])

connection.commit()

注意:INSERT、UPDATE、DELETE 等修改数据的语句需手动执行connection.commit()完成对数据修改的提交。

获取自增 ID

cursor.lastrowid

查询数据

# 执行查询 SQL
cursor.execute('SELECT * FROM `users`')
# 获取单条数据
cursor.fetchone()
# 获取前N条数据
cursor.fetchmany(3)
# 获取所有数据
cursor.fetchall()

游标控制

所有的数据查询操作均基于游标,我们可以通过cursor.scroll(num, mode)控制游标的位置

cursor.scroll(1, mode='relative') # 相对当前位置移动
cursor.scroll(2, mode='absolute') # 相对绝对位置移动

设置游标类型

查询时,默认返回的数据类型为元组,可以自定义设置返回类型。支持5种游标类型:

  • Cursor: 默认,元组类型
  • DictCursor: 字典类型
  • DictCursorMixin: 支持自定义的游标类型,需先自定义才可使用
  • SSCursor: 无缓冲元组类型
  • SSDictCursor: 无缓冲字典类型

无缓冲游标类型,适用于数据量很大,一次性返回太慢,或者服务端带宽较小时。

创建连接时,通过 cursorclass 参数指定类型:

connection = pymysql.connect(host='localhost',
                             user='root',
                             password='root',
                             db='demo',
                             charset='utf8',
                             cursorclass=pymysql.cursors.DictCursor)

也可以在创建游标时指定类型:

cursor = connection.cursor(cursor=pymysql.cursors.DictCursor)

事务处理

  • 开启事务 connection.begin()
  • 提交修改 connection.commit()
  • 回滚事务 connection.rollback()

防 SQL 注入

  • 转义特殊字符
    connection.escape_string(str)

  • 参数化语句 支持传入参数进行自动转义、格式化 SQL 语句,以避免 SQL 注入等安全问题。

    插入数据(元组或列表)

    effect_row = cursor.execute('INSERT INTO users (name, age) VALUES (%s, %s)', ('mary', 18))

    插入数据(字典)

    info = {'name': 'fake', 'age': 15}
    effect_row = cursor.execute('INSERT INTO users (name, age) VALUES (%(name)s, %(age)s)', info)

    批量插入

    effect_row = cursor.executemany(
    'INSERT INTO users (name, age) VALUES (%s, %s) ON DUPLICATE KEY UPDATE age=VALUES(age)', [
    ('hello', 13),
    ('fake', 28),
    ])

参考资料

posted @ 2018-09-10 17:31  Done、  阅读(231)  评论(0编辑  收藏  举报