1. 连接对象(Connection Object)
用MySQL服务器表示套接字。
获取此类实例的正确方法是调用Connect(),用于建立与MySQL数据库的连接,可以接受多个参数:
1.1 参数
host - 数据库服务器所在的主机
user - 作为用户名来登陆
password(passwd) – 登陆的密码。
database - 要使用的数据库,None表示不使用特定的数据库。
port – 要使用的MySQL端口(默认值:3306)
bind_address - 当客户端有多个网络接口时,指定从哪个接口连接到主机。参数可以是主机名或IP地址。
unix_socket – 通信方式您可以选择使用unix socket而不是tcp/ip。
read_timeout – 读取连接超时(秒)(默认值:None)
write_timeout – 写入连接超时(秒)(默认值:None )
Charset–要使用的字符集。
SQL_mode – 默认使用的SQL_MODE。
read_default_file – 指定my.cnf文件从[客户机]部分读取这些参数。
conv – 要使用的转换字典,而不是默认字典。用于提供自定义类型的封装和解析。见转换器。
use_unicode – 是否默认为unicode字符串。对于py3,此选项默认为true。
client_flag – 发送到MySQL的自定义标记。在constants.CLIENT中查找潜在值。
Cursorclass – 要使用的自定义游标类。
init_command – 建立连接时要运行的初始SQL语句。
connect_timeout – 超时后连接异常。(默认值:10,最小值:1,最大值:31536000)
ssl – 类似于mysql_ssl_set()参数的参数字典。
read_default_group - 读取配置文件中要读取的组。
compress – 不支持(Not supported)
name_pipe(命名管道) - 不支持(Not supported)
autocommit – 自动提交模式。None表示使用服务器默认值。(默认值:False)
local_infile – 用于启用加载数据本地命令的布尔值。(默认值:False)
max_allowed_packet – 发送到服务器的最大数据包大小(字节)。(默认值:16MB),仅用于限制小于默认值(16KB)“加载本地文件”数据包的大小。
dafer_connect - 不要在构造时显式连接 - 等待连接调用。(默认值:False)
server_public_key – SHA256身份验证插件的公共key值。(默认值:None)
db – 数据库的别名。(与MySQLdb兼容)
passwd – 密码的别名。(与MySQLdb兼容)
binary_prefix – 在字节和字节数组上添加二进制前缀。(默认值:False)
1.2 连接方法:
begin()方法
开始事务处理。
close()
发送退出消息并关闭端口。
可以参见规范中的connection.close()
触发:Error – 如果连接已经关闭
commit()
将更改提交到稳定存储器。
参见规范中的connection.commit()
cursor(sursor=None)
创建新的游标以执行查询。
参数:cursor – 要创建的游标类型;有Cursor、SSCursor、DictDursor或SSDictcursor。None表示使用Cursor。
open
如果连接是打开状态,则返回true
ping(reconnect=true)
检查服务器是否处于活动状态。
参数:reconnect - 如果连接已关闭,请重新连接。
触发:Error - 如果连接已关闭且Reconnect=false。
rollback()
回滚当前事务。
参见规范中的connection.rollback()。
select_db(db)
设置当前数据库。
参数:db – 使用数据库的名称。
show_warnings()
发送“SHOW WARNINGS”SQL命令。
2. 游标对象(Cursor Objects)
2.1 pymysql.cursors.cursor类(连接)
这是用于与数据库交互的对象。
不要自己创建游标实例。调用方法connections.connection.cursor()。
参见规范中的游标方法:
callproc(procname,args=)
用参数执行存储过程
procname–格式为字符串,是要在服务器上执行的进程的名称
args–程序要使用的参数序列
返回原始参数。
兼容性警告1:PEP-249指定了必须返回任何已修改的参数,不过目前来说这是不可能的,因为只能先将它们存储在服务器变量中,然后通过查询进行检索才可用。但是由于存储过程返回零个或多个结果集,因此没有可靠的方法通过callproc来获取out或inout参数。服务器变量名为@procname_n,其中procname是上面的参数,n是参数的位置(从0开始)。一旦获取了该过程生成的所有结果集,就可以选取使用 @_procname_0,
… 查询使用execute()来获取任意out或inout值。
兼容性警告2:调用存储过程本身的操作将创建一个空结果集,这个出现在进程生成的结果集之后。这是不符合DB-API标准的行为。必须使用nextset()来遍历所有结果集,否则可能会断开连接。
close()
关闭游标只会清理所有遗留的数据。
excute(query,args=None)
执行查询操作
参数:
query(str)–要执行的查询。
args(tuple、list或dict)–用于查询的参数。(可选)
returns:受影响的行数
return type:int
如果args是列表或元组,则可以将%s用作查询中的占位符。如果args是字典,则可以将%(name)s用作查询中的占位符。
executemany(query,args)
针对一个查询使用多个数据
参数:
query–要在服务器上执行的查询
args–序列或映射的序列。用作参数。
returns:受影响的行数(如果有)。
这个方法提高了多行插入和替换的性能。否则,它相当于使用execute()循环参数。
fetchall()
提取所有行
fetchmany(size=None)
提取指定行
fetchone()
提取下一行
max_stmt_length=1024000
Executemany()方法生成的语句的最大长度。
max_allowed_packet-packet_header_size是语句所允许的最大大小。
max_allowed_packet的默认值是1048576。
mogrify(query,args=none)
返回通过调用execute()方法发送到数据库的精确字符串。
此方法遵循对DB API 2.0的扩展。
setinputsizes(*args).
不执行任何操作,这是DB API所要求的。
setoutputsizes(*args).
不执行任何操作,这是DB API所要求的。
2.2 pymysql.cursors.SScursor类(连接)
无缓冲游标,主要用于返回大量数据的查询,或用于通过慢速网络连接到远程服务器。
根据需要提取行,而不是将每一行数据复制到缓冲区中。这样做的好处是,客户机使用的内存要少得多,当通过慢速网络或结果集很大时,返回行的速度要快得多。
但也有局限性。MySQL协议不支持返回总行数,因此唯一的方法是遍历返回的每一行。此外,由于内存中只保存了当前行,因此当前无法向后滚动。
close()
关闭游标只会清理所有遗留的数据。
fetchall()
按mysqldb取全部。对于大型查询没什么用,因为它是缓冲的。如果需要没有缓冲的生成器版本,请参见fetchall_unbuffered()。
fetchall_unbuffered()
获取所有行,作为一个生成器实现。这不符合标准,但是,返回列表中的所有内容没有意义,因为这将使大型结果集占用大量的内存。
fetchmany(size=None)
取出多行
fetchone()
取下一行
read_next()
读下一行
2.3 pymysql.cursors.dictcursor类(连接)
以字典形式返回结果的游标。
2.4 pymysql.cursors.ssdictcursor类(连接)
一种无缓冲的游标,它以字典的形式返回结果。
3. 连接范例:
下面这个例子使用了一个简单的表,然后对它进行操作:
#首先建个表
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) COLLATE utf8_bin NOT NULL,
`password` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1 ;
import pymysql.cursors
#然后连接数据库
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
#对数据库进行操作
try:
with connection.cursor() as cursor:
# 创建新记录
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
cursor.execute(sql, ('webmaster@python.org', 'very-secret'))
# 默认不会自动提交,所以需要我们自己提交来保存改变后的内容*
connection.commit()
with connection.cursor() as cursor:
# 读取单个记录
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
cursor.execute(sql, ('webmaster@python.org',))
result = cursor.fetchone()
print(result)
finally:
connection.close()
这段语句将会输出:
{‘password’: ‘very-secret’, ‘id’: 1}