这里仅介绍 MySQL 官方开发的 Python 接口,参见这里:
https://dev.mysql.com/doc/connector-python/en/
Chapter 1 Introduction to MySQL Connector/Python
这个接口是用纯Python写成的,仅依赖 Python Standard Library。
MySQL Connector/Python 支持以下几点:
1、MySQL Server 版本到 5.7 及 5.7 版本的几乎所有特性;
2、支持Python 和 MySQL 参数的数据类型之间的双向转换,例如 Python 的 datetime 和 MySQL 的 DATETIME;
3、MySQL 对标准的SQL语法的所有的拓展;
4、协议压缩,这使得客户端和服务器之间的数据流被压缩了;
5、使用 TCP/IP sockets 建立链接,在 Unix 平台使用 Unix sockets 建立链接;
6、使用 SSL 建立安全的 TCP/IP 链接;
7、自包含驱动程序。意味着 Connector/Python 在 Python 标准库之外不需要 MySQL 客户端库程序或者任何 Python 模块。
Chapter 2 Guidelines for Python Developers
如下的设计指南覆盖了开发 MySQL 应用程序的各个方面,可能对于有Python背景的开发人员来说不是那么明显。
1、出于安全性考虑,不要把连接、登录到数据库中的值硬编码到主脚本文件中。Python 有一个 config.py 模块的习俗,你可以把这些值保存到这里;
2、受到可以使用的RAM的限制,Python 脚本经常在内存中构建和拆解大的数据结构。因为MySQL经常处理好几倍大于可用内存的数据集合,能优化存储空间和磁盘I/O的技术是尤其重要的。例如,在MySQL 表格中,往往使用数值型IDs而不是基于字符串的词典关键值,因此键值是紧凑的并且长度是可以预料的。对于那些构成InnoDB表格中的Primary Key 的列,这一点是尤为重要的,因为这些列值使用第二索引值复制的;
3、所有接受输入的应用程序必须处理坏的数据:
坏的数据可能是意外的,例如值超出范围,或者字符串格式错误。应用程序可以使用服务器端的例如 unique constraints 和 NOT NULL constraints 的检查,来保证坏的数据放到数据库中。在客户端,使用异常检查来报告任何的问题并且采取纠正措施。
坏的数据也可能是蓄意的,典型的代表是SQL注入攻击。例如,输入值允许引号,分号,“%” 和下划线通配符字符等其他的在SQL语句中有特殊意义的字符。验证输入值确保他们只有预期的字符。当把字符插入到SQL语句中转义任何可能导致故意的行为的字符。在未经验证和转义之前,永远不要把用户输入的字符串插入到SQL语句中。即便是接收其他应用程序产生的字符串,期待其他的应用程序可能已经让步,传递给你不正确的或者有害的数据。
4、因为SQL查询语句的结果集合可能非常的大,使用合适的方法在循环中遍历得到结果值。当你知道结果集合只有一行,fetchone() 返回一个项目;当你知道结果结合有有限的行并且能够轻而易举地放到内存中, fetchall() 返回所有的项目。当你不能决定结果集合的大小时,fetchmany() 通用方法,在循环中调用它知道结果结合没有更多的值。
5、由于Python已经有非常方便的模块例如 pickle 和 cPickle 用来读取磁盘上的数据结构,相反的你选来保存到MySQL中的数据很有可能有特殊的特征:
1)太大以至于不能同时加载到内存中。使用 SELECT 语句来查询你需要的精确的项目,使用聚合函数在多个项目上做计算。在 MySQL 服务器上使用选项 innodb_buffer_pool_size 来控制缓存查询结果占用的RAM总容量。
2)太复杂以至于不能使用一个单一的数据结构来表达。把数据拆分到不同的表格中。在查询语句中使用 join 关键字来组个多个表格。使用 foreign key 来包保证不同表格之间的同步关系。
3)更新太频繁,有可能是多个用户同时使用。更新可能只是影响数据的一小部分,但是每一次都要重写整个数据机构就很浪费。使用 INSERT, UPDATE, DELETE 语句并行地更新不同的项目,只把有改变的值写到磁盘中。使用 InnoDB 表格和事务来保证写操作不会互相冲突,并且保证查询语句返回的结果的一致性,即便底层数据被更新了。
6、使用 MySQL 性能最好的惯例,能够帮助你的应用程序在不需要重大的重写或者架构调整的情况下裁剪。它提供了SQL微调,设局库设计,服务器配置的准则和小提示。
7、没有必要重造轮子,使用 MySQL 的 SQL 语句做常用操作:查询中的操作符,成批导入数据的技巧,等等。有一些语句和自居是对SQL标准的扩展。
8、在Python中发起SQL语句可能用到非常长的有可能是多行的字符串。因为SQL语句中的字符串字面值可能用单引号括双引号或者其中之一的括起来,为了简便,可以使用Python的3引号机智来包裹SQL语句,例如:
"""It doesn't matter if this string contains 'single'
or "double" quotes, as long as there are't 3 in a
row."""
9、快速的,可扩展的 MySQL 应用程序秘诀之一,就是在设计阶段最开始的使用 CREATE TABLE 语句中使用了正确的语法。例如 Oracle 推荐大多数的表格使用 ENGINE=INNODB 字句,并且从 MySQL5.5 及以上版本中都用 InnoDB 作为默认的存储引擎。另外一个推荐值就是每个表格使用数值型的 primary key 。
下一篇讲实际操作。