专栏名称: python实战
Python实战
目录
相关文章推荐
51好读  ›  专栏  ›  python实战

只有20%的人知道flask数据库操作的知识重点

python实战  · 公众号  · Python  · 2017-01-19 19:48

正文

请到「今天看啥」查看全文


数据库是一个网站的基础,在 Flask 中可以自由的使用 MySQL PostgreSQL SQLite Redis MongoDB 来写原生的语句实现功能,也可以使用更高级别的数据库抽象方式,如 SQLAlchemy MongoEngine 这样的 OR(D)M 。本教程以 MySQL+SQLAlchemy 的组合来进行讲解。

在讲解 Flask 中的数据库操作之前,先确保你已经安装了以下软件:

* mysql :如果是在 windows 上,到 http://dev.mysql.com/downloads/windows/ 下载。如果是 ubuntu ,通过命令 sudo apt-get install mysql-server libmysqlclient-dev -yq 进行下载安装。

* MySQLdb MySQLdb 是用 Python 来操作 mysql 的包,因此通过 pip 来安装,命令如下: pip install mysql-python

* SQLAlchemy SQLAlchemy 是一个数据库的 ORM 框架,我们在后面会用到。安装命令为: pip install SQLAlchemy

通过 SQLAlchemy 连接数据库:

from sqlalchemy import create_engine

# 数据库的配置变量

HOSTNAME = '127.0.0.1'

PORT = '3306'

DATABASE = 'xt_flask'

USERNAME = 'root'

PASSWORD = 'root'

DB_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)


# 创建数据库引擎

engine = create_engine(DB_URI)

# 创建连接

with engine.connect() as con:

rs = con.execute('SELECT 1')

print rs.fetchone()


首先从 sqlalchemy 中导入 create_engine ,用这个函数来创建引擎,然后用 engine.connect() 来连接数据库。其中一个比较重要的一点是,通过 create_engine 函数的时候,需要传递一个满足某种格式的字符串,对这个字符串的格式来进行解释:

dialect+driver://username:password@host:port/database

dialect 是数据库的实现,比如 MySQL PostgreSQL SQLite ,并且转换成小写。 driver Python 对应的驱动,如果不指定,会选择默认的驱动。比如 MySQL 的默认驱动是 MySQLdb username 是连接数据库的用户名, password 是连接数据库的密码, host 是连接数据库的域名, port 是数据库监听的端口号, database 是连接哪个数据库的名字。

如果以上输出了 1 ,说明 SQLAlchemy 能成功连接到数据库。

SQLAlchemy 执行原生 SQL

我们将上一个例子中的数据库配置选项单独放在一个 constants.py 的文件中,看以下例子:

python

from sqlalchemy import create_engine

from constants import DB_URI

# 连接数据库

engine = create_engine(DB_URI,echo=True)

# 使用 with 语句连接数据库,如果发生异常会被捕获

with engine.connect() as con:

# 先删除 users

con.execute('drop table if exists users')

# 创建一个 users 表,有自增长的 id name

con.execute('create table users(id int primary key auto_increment,'

'name varchar(25))')

# 插入两条数据到表中

con.execute('insert into users(name) values("xiaoming")')

con.execute('insert into users(name) values("xiaotuo")')

# 执行查询操作

rs = con.execute('select * from users')

# 从查找的结果中遍历

for row in rs:

print row


使用 ORM

随着项目越来越大,采用写原生 SQL 的方式在代码中会出现大量的 SQL 语句,那么问题就出现了:

1. SQL 语句重复利用率不高,越复杂的 SQL 语句条件越多,代码越长。会出现很多相近的 SQL 语句。

2. 很多 SQL 语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些 SQL 语句的修改。

3. SQL 时容易忽略 web 安全问题,给未来造成隐患。

ORM ,全称 Object Relational Mapping ,中文叫做对象关系映射,通过 ORM 我们可以通过类的方式去操作数据库,而不用再写原生的 SQL 语句。通过把表映射成类,把行作为示例,把字段作为属性, ORM 在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。使用 ORM 有许多优点:

1. 易用性:使用 ORM 做数据库的开发可以有效的减少重复 SQL 语句的概率,写出来的模型也更加直观、清晰。

2. 性能损耗小: ORM 转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足 5% ),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。

3. 设计灵活:可以轻松的写出复杂的查询。

4. 可移植性: SQLAlchemy 封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的 MySQL PostgreSQL SQLite 。可以非常轻松的切换数据库。


下一节讲会讲解如何使用一个非常出名的 ORM 系统: SQLAlchemy










请到「今天看啥」查看全文