鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流。

对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文档

一.安装(install)

需要有安装python的PC一台,介于windows系统用户比较多,本文章使用的是windows下开发。

1.创建虚拟

为每一个工程创建一个独立的python运行环境是我们所需要的,python提供了virtualenv,可以为我们提供这个特殊的需求。

配置virtualenv环境

windows环境下运行cmd.exe,使用管理员权限运行。

 pip install virtualenv

笔者使用的python版本是3.5.2,该版本中自动配置了pip应用,使用pip指令可以很方便的下载到你所需要的python拓展库。  

安装成功后会出现successfully installed virtualenv字样。

PS:如果pip指令无法使用,请确认python环境下scripts是否包含在系统环境变量中的Path中。

使用控制台进入你需要配置该虚拟环境的目录,使用mkdir创建工程的文件夹,笔者创建的工程名为sqlalchemy_demo

  mkdir sqlalchemy_demo

创建虚拟Python运行环境

 virtualenv flask

出现如下字样,说明虚拟环境创建成功

进入工程文件夹,激活虚拟python运行环境

 flask\scripts\activate

出现如下字样显示,说明进入虚拟python运行环境成功

2.安装所需要的库文件

我们需要两个库文件,一个是flask,另一个是flask-SQLAlchemy。使用pip指令安装

 pip install flask
pip install flask-sqlalchemy

看到如下字样说明两个库文件安装成功

至此,环境配置阶段结束。

二.flask-SQLAlchemy简介

flask-SQLAlchemy 是一个为您的flask应用增加SQLAlchemy支持的扩展。

在python扩展库中其实包含了SQLAlchemy。在版本的不断叠加后,已经被整合到flask架构中,flask-SQLAlchemy简化在Flask中SQLAlchemy的使用,提供了有用的默认值和额外的助手来更简单地完成常见任务。

笔者认为SQLAlchemy比较精髓的是使用ORM(对象关系映射),相对于传统连接数据库使用select,update,insert,delete操作数据表来说具有以下特点[1]:

  简单——以最基本的形式建模数据

  传达性——数据库结构被任何人都能理解的语言文档化

  精确性——基于数据模型创建正确标准化的结构

完事无绝对,ORM有明显的优势,就会想伴随有缺点。

  隐蔽性——相对于传统使用select,update,insert,delete来说,隐藏了操作数据表的具体操作,不利于SQL的学习

  数据表结构修改难——在设计中有时会忽略了一些字段的定义,在ORM模式中只能更新映射表更新字段,而且效果远不如alter table [表名] add 字段名更新字段来的容易理解,常常会忽略一些细节

但不得不说,ORM模式的确打开了新世界的大门,大大减少了学习及使用数据库的过程与难度。

三.在实例中应用

1.文件结构

sqlalchemy_demo--->flask

         --->database.py

         --->model.py

         --->test.py

2.创建SQLAlchemy配置文件

database.py代码如下所示

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
basedir = os.path.abspath(os.path.dirname(__file__)) app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app) def db_init():
db.create_all()

一句一句解释

(1)from flask import Flask

Flask类是flask框架的核心类,它实现了WSGI应用规范。

(2)from flask_sqlalchemy import SQLAlchemy

将flask-sqlchemy中内置的SQLAlchemy引用到该文件下。

(3)import OS

本实例中需要将数据库创建在工程的更目录下,使用python内置os库可以很方便的定位到工程路径下。

(4)basedir = os.path.abspath(os.path.dirname(__file__))

将当前文件传入dirname函数中,获取当前文件所在路径,abspath函数获取该文件所在的绝对路径,以便在后边配置创建数据库的路径使用。

(5)app = Flask(__name__) [2]

Flask构造函数的第一个参数指定一个引入参数/importname。

Flask框架使用这个名字进行静态资源、模板、错误信息的定位。除非你清楚的理解它的作用,通常情况下,我们总应该使用特殊变量__name__。

Flask实例是可调用的(具有call方法),这个实例可以直接对接 WSGI服务器。

(6)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

SQLALCHEMY_DATABASE_URI:用于连接数据库

  eg:sqlite:////tmp/test/db

    mysql://username:password@server/db

SQLALCHEMY_TRACK_MODIFICATIONS:

如果设置成True(默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。如果你不显示的调用它,在最新版的运行环境下,会显示警告。

(7)db = SQLAlchemy(app)

SQLAlchemy函数,将刚刚创建的Flask框架,与工程所需要使用的数据库绑定到一起,以便实现工程与数据库连接,实现数据操作。

(8)db_init()函数

手动创建函数,以便初始化数据库

以上就是配置database.py的一些说明,但现在还远远不够,因为当前工程的数据库在创建之后只是单纯的一个空数据库,不包含任何数据表。

那怎么创建数据表呢,工程下需要一个映射表,以便将表格映射到数据库中,以达到创建表格的作用。

3.创建映射表

如下为一段创建最简单的User数据表的代码。

from database import db

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True) def __init__(self, username, email):
self.username = username
self.email = email def __repr__(self):
return '<User %r>' % self.usernam

仍然是逐句解释

(1)from database import db

将刚刚创建的SQLAlchemy应用引用到当前文件,以便将映射表映射到数据库中,以便对于数据表的创建修改以及更新删除。

(2)db.Model

上边提到,当工程文件不提供映射表时将创建一个空的数据库文件。继承db.Model类,将我们当前创建的映射表和数据库db绑定在一起。此时工程文件调用create_all函数后,会自动将绑定后的映射表文件创建在数据库文件中。

如果想探究详细绑定关系,请应用纯SQlAlchemy库,而不是flask-sqlalchemy库,之前调到了flask-sqlalchemy是简化版的SQLAlchemy,隐藏了许多细节,深入研究请转至SQLAlchemy官方文档查看应用细节。

(3)db.Column

创建映射表字段,以下为最常见的类型

Integer 存储整数
String(size) 存储有长度的字符串
Text 存储较长的unicode文本
DateTime 存储时间类型数据
Float 存储浮点值
Boolean 存储布尔值
PickleType 存储一个python对象
LargeBinary 存储一个任意大的二进制数据

primary_key=True设置当前字段为主键

uniqu=True设置当前字段不可重复

当然也可以设置主键外键,在本文中只创建了一张数据表,在以后的文章中将说明此操作。

(4)__init__函数

为映射表的构造函数,一般用来初始变量,配置相关数据时使用

(5)__repr__函数

为以后调试输出提供接口

4.修改database.py

将下面的代码添加到database.py的底部

from model import User

Q:为什么添加到底部呢?

A:如果你添加到头部引用model中的User,此时User类已经被引用并创建。有没有发现一个问题,User类继承了db.Model类,那么此时User类创建的时候无法找到db这个参数,因为db参数还没有创建。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
from model import User

上边的就是错误的例子,当你引用User类时,此时db对象还没有被创建,所以调用db_init()函数时会显示ImportError: cannot import name 'User'

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
...
db = SQLAlchemy(app)
...
from model import User

上边的伪代码就是正确的写法,引用User类的时机至少要等到db对象创建结束后才能引用。为什么放在底部呢?为了调整文件结构,使代码看起来不是很乱,放在其他处也没关系,但请注意以下两点:

(1)如果你打算在该文件引用User类,请保证全局引用。

(2)无论发在哪里,至少要在db = SQLAlchemy(app)执行后,生成db对象才能进行引用,否则会导致model.py文件执行错误。

至此,映射表文件创建成功。

4.创建数据库

将以上配置结束后,可以调用db_init()函数创建数据库了。

还记得之前配置的虚拟python运行环境么,在虚拟环境下输入python,进入python指令模式进行创建

此时,工程文件夹根目录已经生成了内置的sqlite数据库文件test.db

四.SQLAlchemy下的数据库操作

1.insert

添加4个用户,将database.py中的User和db引用到文件中,此处必须引用database中的User,如果引用model中的User会造成循环引用,因为model.py中引用了database模块中的db变量

from database from User,db

u1 = User(username= 'john', email = 'john@example.com')
u2 = User(username= 'susan', email = 'susan@example.com')
u3 = User(username= 'mary', email = 'mary@example.com')
u4 = User(username= 'david', email = 'david@example.com')
db.session.add(u1)
db.session.add(u2)
db.session.add(u3)
db.session.add(u4)
db.session.commit()

(1)对象 = User(字段1='值1',字段2='值2')

相当于SQL操作INSERT INTO User VALUES(字段1='值1',字段2='值2'),并将该SQL语句赋值到一个对象上

(2)db.session.add()

将对于数据库的操作保存在缓存中,既然是保存到缓存中,那么该数据库语句还没有提交到数据库中

(3)db.session.commit()

commit()和数据库中的commit指令一样,将数据库操作提交到数据库中。

2.select

查询所有用户信息,并输出结果

from database import User, db

for user in User.query.all():
print(user.id, user.name, user.email)

以下是运行产生的结果

(1)精确查询

查询用户名为susan的用户邮箱

from database import User, db

u = User.query.filter_by(username='susan').first()
print(u.email)

(2)模糊查询

查询邮箱以example.com结尾的用户,输出用户名及邮箱

from database import User, db

for user in  User.query.filter(User.email.ilike('%example.com')).all():
print(user.username, user.email)

以下是运行产生的结果

PS:将查询出的结果按照正序或者逆序排序请使用,以username为例order_by(User.username)正序,order_by(User.username.desc())逆序

3.update

更新操作和查询操作有交集,请看以下代码示例,将john的邮箱修改为john@example.vip.com

from database import User, db

u = User.query.filter_by(username='john').first()
u.email = 'john@example.vip.com'
db.session.add(u)
db.session.commit()

解释起来就是首先将对象查询出来,然后将修改的字段赋值,并将查询出的对象提交到数据库,这样更新操作就结束了。

4.delete

将david用户删除

from database import User, db

u = User.query.filter_by(username='john').first()
db.session.delete(u)
db.session.commit()

调用delete()函数,将数据传入db对象,并提交到数据库中。

五.单体测试框架测试

对本文提到的操作进行单体测试。(test.py文件代码如下)

import unittest
from database import User, db class TestCase(unittest.TestCase):
def setUp(self):
pass def tearDown(self):
pass def test_db(self):
u1 = User.query.filter_by(username='john').first()
u2 = User.query.filter_by(username='susan').first()
u3 = User.query.filter_by(username='mary').first()
u4 = User.query.filter_by(username='david').first() assert u1.email == 'john@example.vip.com'
assert u2.email == 'susan@example.com'
assert u3.email == 'mary@example.com'
assert u4.email == 'david@example.com' u5 = User(username='Alima', email='Alima@example.com')
db.session.add(u5)
db.session.commit() u = User.query.filter_by(username='Alima').first()
assert u.email == 'Alima@example.com' u5.email = 'Alima@example.vip.com'
db.session.add(u5)
db.session.commit() u = User.query.filter_by(username='Alima').first()
assert u.email == 'Alima@example.vip.com' db.session.delete(u5)
db.session.commit() u = User.query.filter_by(username='Alima').first()
assert u == None if __name__ == '__main__':
unittest.main()

执行test.py,运行结果:

显示OK,单体测试结束。

以上就是基本的flask-SQLAlchemy初级使用实例说明,欢迎探讨转载及引用参考,你们的回应是我的动力。

如果文中存在错误或是某个地方说的不够精确,劳烦批评指出。

以上,辛苦了。

参考资料:
[1] [sogou][搜狗百科][ORM] http://baike.sogou.com/v75834.htm?fromTitle=ORM
[2] [csdn][seanb][Flask中路由使用解析] http://blog.csdn.net/seanb/article/details/51454833
[3] [flask][flask-sqlalchemy][官方文档] http://flask-sqlalchemy.pocoo.org/2.1/

*本文为Alima原创,如果转载请联系笔者,转载注明格式[转载][博客园][Alima][关于flask-SQLAlchemy的初级使用教程],并在文尾注明本文链接,多谢合作。

*非法转载及非法抄袭博文将依照网络著作权流程办理,请尊重作者劳动成果

[python][flask][flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程的更多相关文章

  1. python 全栈开发,Day142(flask标准目录结构, flask使用SQLAlchemy,flask离线脚本,flask多app应用,flask-script,flask-migrate,pipreqs)

    昨日内容回顾 1. 简述flask上下文管理 - threading.local - 偏函数 - 栈 2. 原生SQL和ORM有什么优缺点? 开发效率: ORM > 原生SQL 执行效率: 原生 ...

  2. Python开发篇——如何在Flask下编写JWT登录

    首先,HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息)--每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求 ...

  3. Python轻量Web框架Flask使用

    http://blog.csdn.net/jacman/article/details/49098819 目录(?)[+] Flask安装 Python开发工具EclipsePyDev准备 Flask ...

  4. Python框架学习之用Flask创建一个简单项目

    在前面一篇讲了如何创建一个虚拟环境,今天这一篇就来说说如何创建一个简单的Flask项目.关于Flask的具体介绍就不详细叙述了,我们只要知道它非常简洁.灵活和扩展性强就够了.它不像Django那样集成 ...

  5. python web框架简介Bottle Flask Tornado

    Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. ? 1 2 3 4 pip inst ...

  6. 初识python轻量web框架flask

    1.使用pip安装Python包 大多数Python包都使用pip实用工具安装,使用pyvenv创建的虚拟环境会自动安装pip. 1.使用pip安装Flask(其它Python包同理) pip ins ...

  7. Python超级明星WEB框架Flask

    Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...

  8. python之restful api(flask)获取数据

    需要用到谷歌浏览器的扩展程序 Advanced Rest Client进行模拟请求 1.直接上代码 from flask import Flask from flask import request ...

  9. day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-SQLAlchemy的创建模型类和基本的增删改查

    目录 1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在 ...

随机推荐

  1. S2SH商用后台权限系统第一讲

    各位博友: 您好!从今天开始我们做一套商用的权限系统.功能包含用户管理.角色管理.模块管理.权限管理.大家知道每个商用系统肯定会拥有一套后台系统,我们所讲的权限系统是整个系统核心部分.本套系统技术有s ...

  2. Unity3D问题之EnhanceScollView选择角色3D循环滚动效果实现

    需求 呈现3D效果(2D素材)选择角色效果 滚动保证层级.缩放比例.间距正常尾随 循环滚动 这个界面需求一般也会有游戏会採用(貌似有挺多) 怎样实现 实现技术关键点 (3D循环效果,依据数学函数和细致 ...

  3. JavaScript常用正则表达式与应用(一)

    JavaScript的String类和RegExp对象类都定义了相关方法使用正则表达式进行模式匹配,本文将以连载方式介绍JavaScript常用正则表达式与相关应用,欢迎交流 本节是连载一,首先介绍J ...

  4. 【课程分享】基于Lucene4.6+Solr4.6+Heritrix1.14+S2SH实战开发从无到有垂直搜索引擎

    对这个课程有兴趣的朋友,能够加我的QQ2059055336和我联系,能够和您分享.  课程介绍:最有前途的软件开发技术--搜索引擎技术  搜索引擎作为互联网发展中至关重要的一种应用,已经成为互联网各个 ...

  5. sql语法:inner join on, left join on, right join on具体用法

    inner join(等值连接) 仅仅返回两个表中联结字段相等的行 left join(左联接) 返回包含左表中的全部记录和右表中联结字段相等的记录 right join(右联接) 返回包含右表中的全 ...

  6. <BEA-141281> <unable to get file lock, will retry ...> --reference

    I ran into this error the first time I restarted Weblogic on one of my installs, the only reference ...

  7. ssh-add命令

    ssh-add命令是把专用密钥添加到ssh-agent的高速缓存中.该命令位置在/usr/bin/ssh-add ➜ ydoc git:(v2.0.0) ✗ sudo ssh-add ~/.ssh/i ...

  8. linux的nohup disown setsid screen

    ```nohup 可以将进程挂起 帐号退出时不受影响 nohup cp -r a b/ [>/~/cp.log] & setsid 作用类似于nohup swtsid cp -r a b ...

  9. 万网免费主机wordpress快速建站教程-万网主机申请

    很多小伙伴在万网的免费主机申请活动中建立起了自己的个人网站,但还是还有许多小伙伴现在想建站,却发现官网找不到免费主机的申请地址了,以为活动结束了?其实还是可以继续申请免费主机的,接下来小编给大家介绍如 ...

  10. JS操作CSS样式

    一.样式表(css) 使用样式表可以更好的显示WEB文档,也可以结合javascript从而实现很好的控制样式表. 样式(css)与内容(html): HTML是处理文档结构的,HTML可以实现如何把 ...