Python与数据库的连接
关系数据库编程
- 在Python中操作不同的数据库需要引入不同的数据库包。常用数据库引擎的Python包如下:
数据库 | Python包 |
---|---|
MySQL | MySQLdb |
MS SQL Server | pymssql |
- 虽然每种数据库引擎的Python包不同,但是所有Python的数据引擎都遵守DB-API规范,此规范使得引用数据库引擎后的编程方法大致相同,Python数据库编程的步骤如下:
- 引入Python引擎包:如import MySQLdb语句用于为MySQL操作做准备。
- 连接数据库:使用引擎包中的connect方法连接物理数据库,通常在本步骤需要输入数据库的IP地址、端口、数据库名、用户名及密码等。
- 获取游标:在DB-API规范中,游标(cursor)用于执行SQL语句并且管理查询到的数据集。
- 执行SQL命令:将SQL命令传给游标执行,并解析返回的结果。本步骤可以多次进行。
- 提交或者回滚事务:在执行DML(数据操作语言)类的SQL语句时,数据库引擎会自动启动新事务,在一系列的操作完成之后,可以提交或回滚当前事务。
- 关闭游标:完成SQL操作后关闭游标。
- 关闭数据库连接:关闭Python客户端和数据库服务器的连接。
- 示例(Python连接MySQL):
# 引入pymysql包
import pymysql
# 连接数据库并打开library数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='654321', db='library')
# 获取游标对象
cur = conn.cursor()
# 执行SQL语句
cur.execute("SELECT * FROM book")
# 获取执行结果
rows = cur.fetchall()
print("number of records: ", len(rows))
for i in rows:
print(i)
# 关闭游标对象
cur.close()
# 关闭数据库连接
conn.close()
ORM编程
- 除了使用SQL语句操作操作关系数据库外,Python中的另一种与关系数据库进行交互的技术是ORM(Object-Relation Mapping,对象关系映射),其作用是在关系型数据库和业务实体对象之间做一个映射,这样开发者在操作数据库时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。每种编程语言都有自己的ORM库,如Java的Hibernate、iBATIS;Python的SQLAlchemy等。
- 所有的ORM必须具备三方面的能力:映射技术、CRUD操作和缓存优化。
- 映射技术
- 数据类型映射
将数据库的类型映射为编程语言自身的类型- 类映射
将数据表定义映射为编程语言自身的类,这样,数据表中的每一条记录就可以映射为编程语言自身的对象。- 关系映射
将数据库中基于外键的关系连接转换为编程语言中基于对象引用的关系连接。
- CRUD操作
- CRUD操作指的是数据库处理时的创建(Create)、读取(Retrieve)、更新(Update)、删除(Delete)操作。在SQL中有INSERT、SELECT、UPDATE、DELETE四种语句实现CRUD,而在编程语言中则常常提供insert、update、delete、query四种函数来实现CRUD。
- 缓存优化
- 由于数据库操作通常比较耗时,所以ORM需要提供数据缓存优化功能。
- ORM优势:
- 隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
- 在ORM年表的史前时代,我们需要将我们的对象模型转化为一条一条的SQL语句,通过直连或是DB helper在关系数据库构造我们的数据库体系。而现在,基本上所有的ORM框架都提供了通过对象模型构造关系数据库结构的功能。
Python-ORM编程实战
这里使用轻量级ORM框架——Peewee进行实战,从而能够迅速掌握ORM编程思路。由于在一般情况下ORM库自身的缓存优化机制可以满足大多数场景的需要,因此我们只需要“弥补”其另外两方面的能力:定义数据表到Python ORM类的映射关系;连接数据库并进行CRUD等操作。
Step0、安装peewee包
在此之前需要安装peewee包,安装时遇到了一些小问题,过程有点曲折,这里进行记录:
- 首先在如下位置创建如下文件以及文本(圈出来的部分都是手动新建的):
文本内容如下(参考自这里):
- 然后再进行安装就可以了!
Step1、创建数据库/表
create database sampledb
use sampledp
CREATE TABLE `course` (
`id` int(11) NOT NULL,
`title` text NOT NULL,
`period` int(11) DEFAULT NULL,
`description` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `teacher` (
`id` int(11) NOT NULL,
`name` text NOT NULL,
`gender` tinyint(1) DEFAULT NULL,
`address` text,
`course_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `course_id` (`course_id`),
CONSTRAINT `teacher_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Step2、用peewee定义Python ORM类
- 首先引入了peewee包。
- 用MySQLDatabase()类定义MySQL的数据库实例。
- 定义ORM基类BaseModel,在其中指定了共用的属性database值为之前建立的MySQL连接。
- 类型映射:peewee中预定义了一系列的数据类型,用于定义数据表中的列,在本例中用到了PrimaryKeyField(主键)、CharField(字符串)、IntegerField(整型)、BooleanField(布尔型)等。
- 表映射:定义了两个对象类Course和Teacher,用于映射数据表course和teacher,并在每个类的Meta中设置了数据库中该类对应的真实表名。
- 关系映射:在Teacher中通过ForeignKeyField设置了其与Course的连接关系,ForeignKeyField的参数to_field用于指定被连接的字段名,related_name参数为该关系赋予了一个名字。
- 用CLASSNAME.create_table()自动在数据库中建立符合该类定义的数据表。