mysqlclient的瘦包装。为查询提供python迭代器。提取光标。
pymysql-utils的Python项目详细描述
pymysql实用程序模块
pymysql_utils包通过
python比它的底层包更像python mysqlclient
(以前称为mysql-python)或替代的底层包
pymysql
。可以选择mysqlclient或pymysql作为
PyyyqLL uUTLS的建立。
常用mysql操作的方便方法,如
管理表、插入、更新和查询
可用。查询结果是具有next()
和
nextall()
方法
测试时间:
OS | MySQL | Python |
---|---|---|
macos | mysql 8.0 | 3.7 |
macos | mysql 8.0 | 2.7 |
ubuntu 16.04 Xenial | mysql 5.7 | 3.6 |
ubuntu 16.04 Xenial | mysql 5.7 | 2.7 |
快速启动
frompymysql_utils.pymysql_utilsimportMySQLDB# Create a database instance. For one approach to# dealing with password-protected databases, see# the Tips Section below.db=MySQLDB(user='myName',db='myDb')mySchema={'col1':'INT','col2':'varchar(255)',}db.createTable('myTable',mySchema)# Fill the table:colNames=['col1','col2']colValues=[(10,'row1'),(20,'row2'),(30,'row3'),]db.bulkInsert('myTable',colNames,colValues)# Result objects are iterators:forresultindb.query('SELECT col2 FROM myTable ORDER BY col1'):print(result)# row1# row2# row3
更详细一点
数据库连接封装在
MySQLDB
。此实例可以维护多个查询
同时。每个查询结果都是一个iterator
对象
从中可以一个接一个地检索结果元组,
使用next()
,或者同时使用nextall()
。这是
交叉多个查询的示例。假设
上表myTable
在数据库中填充。
query_str1=''' SELECT col2 FROM myTable ORDER BY col1 '''query_str2=''' SELECT col2 FROM myTable WHERE col1 = 20 OR col1 = 30 ORDER BY col1 '''results1=db.query(query_str1)results2=db.query(query_str2)# Result objects know their total result count:results1.result_count()# --> 3results2.result_count()# --> 2# The db object can retrieve the result count# by the query string:db.result_count(query_str1)# --> 3results1.next()# --> 'row1'results2.next()# --> 'row2'results1.next()# --> 'row2'results2.next()# --> 'row3'results1.next()# --> 'row3'results2.next()# --> raises StopIterationresults2.result_count()# --> raises ValueError: query exhausted.
提示:
许多方法返回一个包含警告列表的二元组,以及 错误列表。
检查in-code documentation 对于所有可用的方法。
可以方便地完成许多频繁的sql操作 通过专门的方法:
close
,createTable
,dropTable
,insert
,bulkInsert
、truncateTable
和update
。这些或其他操作也可以通过使用
execute()
提交任意sql对于已知返回单个结果的查询,这是一个有用的习惯用法, 例如计数:
db.query('...').next()
底层的
mysqlclient
包不公开mysql 5.7+ 登录路径选项。因此MySQLDB()
调用需要包含 密码(如果需要)。一种避免将密码放入 您的代码是将密码放入一个受保护的文件中 目录,例如~/.ssh/mysql
。然后从那里读取密码。
安装
# Possibly in a virtual environment: pip install pymysql_utils python setup.py install # Testing requires a bit of prep in the local MySQL:# a database 'unittest' must be created, and a user# 'unittest' without password must have permissions:### CREATE DATABASE unittest; # CREATE USER unittest@localhost;# GRANT SELECT, INSERT, UPDATE, DELETE,# CREATE, DROP, ALTER# ON `unittest`.* TO 'unittest'@'localhost';# The unittests give these instructions as well.# python setup.py test
选择“仅python”或“c-python”
默认情况下,pymysql实用程序使用mysqlclient
,因此基于c
MySQL服务器的API。有时可能需要使用
仅限python的解决方案。您可以强制pymysql实用程序使用
pymysql
库而不是mysqlclient
。
只强制使用python的一个原因是 OpenSSL 1.1.1[a,b,c]和mysqlclient(截至2017年7月29日)。
要让pymysql实用程序使用python-only pymysql库,请执行以下操作:
- 将
pymysql_utils/pymysql_utils_SAMPLE.cnf
复制到pymysql_utils/pymysql_utils.cnf
- 在这个新的配置文件中,更改
FORCE_PYTHON_NATIVE= False to FORCE_PYTHON_NATIVE= True