SQLAlchemy 教程 —— 基础入门篇
一、课程简介
1.1 实验内容
本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLAlchemy 进行简单了 CURD 操作及使用 Faker 生成测试数据。
1.2课程知识点
- 学会用 SQLALchemy 连接数据库(MySQL, SQLite, PostgreSQL), 创建数据表;
- 掌握表数据之间一对一,一对多及多对多的关系并能转化为对应 SQLAlchemy 描述;
- 掌握使用 SQLAlchemy 进行 CURD 操作;
- 学会使用 Faker 生成测试数据
学习本课程需要你对 Python 与 MySQL 都有基本的掌握。
二、ORM 与 SQLAlchemy 简介
ORM 全称 Object Relational Mapping
, 翻译过来叫对象关系映射
。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。
SQLAlchemy 是Python 社区最知名的 ORM 工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。
接下来我们将使用 SQLAlchemy 和 MySQL 构建一个博客应用的实验库。
先安装 SQLAlchemy:
$ sudo pip install sqlalchemy
三、连接与创建
实验楼环境已经为我们安装了 MySQL,但还没有启动, 在启动 MySQL 之前,我们需要进行一些配置,将 MySQL 默认的 latin1 编码改成 utf8 。
$ sudo vim /etc/mysql/my.cnf
通过上面的命令打开 MySQL 的配置文件, 添加下面几个配置:
- [client]
- default-character-set = utf8
-
- [mysqld]
- character-set-server = utf8
- [mysql] default-character-set = utf8
保存退出。现在我们可以启动 MySQL 服务了:
$ sudo service mysql start
在命令行下输入下面命令启动 MySQL:
$ mysql -uroot -p
看到上面的内容就说明我们的 MySQL 可以正常启动了(注意,上面的密码不需要输入内容,直接回车就行), 并且我们我们通过命令:
> create database blog;
创建一个名为 blog
的数据库为下面的使用作准备。
另外,我们需要安装一个 Python 与 MySQL 之间的驱动程序:
$ sudo apt-get install python-mysqldb
3.1 连接数据库
我们在 Code 下新建个 Python 文件,叫什么名字就随你便了,这里我们叫 db.py
,写入下面的内容:
- # coding: utf-8
-
- from sqlalchemy import create_engine
-
- engine = create_engine('mysql+mysqldb://root@localhost:3306/blog')
-
- print(engine)
在上面的程序中,我们连接了默认运行在 3306
端口的 MySQL 中的 blog
数据库。
运行下这个程序,看到下面的信息说明我们已经连接成功了:
3.2 描述表结构
要使用 ORM, 我们需要将数据表的结构用 ORM 的语言描述出来。SQLAlchmey 提供了一套 Declarative 系统来完成这个任务。我们以创建一个 users
表为例,看看它是怎么用 SQLAlchemy 的语言来描述的:
- # coding: utf-8
-
- from sqlalchemy import create_engine
- from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, String, Integer engine = create_engine('mysql+mysqldb://root@localhost:3306/blog?charset=utf8') Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(64), nullable=False, index=True) password = Column(String(64), nullable=False) email = Column(String(64), nullable=False, index=True) def __repr__(self): return '%s(%r)' % (self.__class__.__name__, self.username)