使用Flask-SQLAlchemy管理数据库
SQLAlchemy 是一个很强大的关系型数据库框架,处于数据库抽象层 ,支持多种数据库后台。 提供了高层 ORM,也提供了使用数据库原生 SQL 的低层功能。
安装Flask-SQLAlchemy
首先,激活virtualenv虚拟环境,在虚拟环境安装目录的同级目录下使用命令
venv\Scripts\activate
命令行前出现virtualenv 则表示激活成功
然后,安装Flask-SQLAlchemy
pip install flask-sqlalchemy
配置SQLite数据库
from flask.ext.sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app)
db 对象:是 SQLAlchemy 类的实例,表示程序使用的数据库,同时还获得了 Flask-SQLAlchemy
提供的所有功能。
SQLALCHEMY_DATABASE_URI :程序使用的数据库 URL
SQLALCHEMY_COMMIT_ON_TEARDOWN :将其设为 True 时,每次请求结束后都会自动提交数据库中的变动
定义模型
在 ORM 中,模型一般是一个 Python 类,类中的属性对应数据库表中的列。
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
def __repr__(self):
return '<User %r>' % self.username
__tablename__ :定义在数据库中使用的表名。如果没有定义 tablename,Flask-SQLAlchemy 会使用一个默认名字。
其余的类变量都是该模型的属性,被定义为 db.Column类的实例。db.Column 类构造函数的第一个参数是数据库列和模型属性的类型。
操作数据库
创建表
让 Flask-SQLAlchemy 根据模型类创建数据库。方法是使用 db.create_all() 函数:
(venv) $ python hello.py shell
>>> from hello import db
>>> db.create_all()
查看程序目录,会发现新建了一个名为 data.sqlite 的文件。如果数据库表已经存在于数据库中,那么 db.create_all()不会重新创建或者更新这个表。如果修改模型后要把改动应用到现有的数据库中,这一特性会带来不便。粗暴的解决方式是先删除再重建使用>>> db.drop_all()和>>> db.create_all(),数据库里的数据也会被删除。所以使用 Flask-Migrate插件,这个插件对数据库迁移框架Alembic 做了轻量级包装,并集成到 Flask-Script 中,所有操作都通过 Flask-Script 命令完成。接下来的操作前提是安装并使用了Flask-Migrate。
(备注: 使用Flask-Migrate后,为表新增字段后必须经过一下两条命令才能使新模型生效
(venv) $ python hello.py db migrate -m "initial migration" #自动创建迁移脚本
(venv) $ python hello.py db upgrade #更新数据库,且不影响其中保存的数据
)
查询
模型名.query.all()取对应表中的所有记录:
>>> User.query.all()
[<User u'john'>]
可通过查看原生语句查看该表的字段
>>> str(User.query)
'SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.role_id AS users_role_id, users.password_hash AS users_password_hash, users.confirmed AS users_confirmed \nFROM users \nWHERE users.username = ?'
可以看到模型User对应的表users中的字段有,id, email, username, role_id等
修改
先取到数据再修改然后将修改存回表中
>>> User.query.get(1)
<User u'john'>
>>> u=User.query.get(1) #取数据
>>> print u.email
john@example.com
>>> u.email='john@qq.com' #修改数据
>>> db.session.add(u) #添加
>>> db.session.commit() #提交修改
>>> User.query.get(1).email #查看修改后数据
u'john@qq.com'
删除
>>> db.session.delete(u)
>>> db.session.commit()
插入行
>>> u = User(email='john@example.com', username='john', password='cat')
>>> db.session.add(u)
>>> db.session.commit()
使用Flask-SQLAlchemy管理数据库的更多相关文章
- flask 使用Flask-SQLAlchemy管理数据库(连接数据库服务器、定义数据库模型、创建库和表)
使用Flask-SQLAlchemy管理数据库 扩展Flask-SQLAlchemy集成了SQLAlchemy,它简化了连接数据库服务器.管理数据库操作会话等各种工作,让Flask中的数据处理体验变得 ...
- python3 + flask + sqlalchemy +orm(2):数据库中添加表
往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...
- day95:flask:SQLAlchemy数据库查询进阶&关联查询
目录 1.数据库查询-进阶 1.常用的SQLAlchemy查询过滤器 2.常用的SQLAlchemy查询结果的方法 3.filter 4.order_by 5.count 6.limit&of ...
- Flask系列:数据库
这个系列是学习<Flask Web开发:基于Python的Web应用开发实战>的部分笔记 对于用户提交的信息,包括 账号.文章 等,需要能够将这些数据保存下来 持久存储的三种方法: 文件: ...
- Flask学习之四 数据库
英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database 中文翻译地址:http://ww ...
- Flask 操作Mysql数据库 - flask-sqlalchemy扩展
数据库的设置 Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的.它使用结构化的查询语言.关系型数据库的列定义了表中 ...
- flask SQLAlchemy中一对多的关系实现
SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...
- Flask SQLAlchemy & model
Flask-SQLAlchemy Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命 ...
- flask建表遇到的错误: flask,sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specified key was too long; max key length is 767 bytes')
error:flask,sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specifie ...
- Flask – SQLAlchemy成员增加
目录 简介 结构 展示 技术 运行 代码 创建数据库表单 views视图 home主页 添加成员addnew.html 展示页show_all 简介 结构 $ tree -I "__pyca ...
随机推荐
- iOS - Swift Enumerations or how to annoy Tom
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- sql中的IFNULL函数的应用
select r.status=1 and IFNULL(r.channel_code,'') != 'crm' 这种查询方式的意思就是说如果r.channel_code为空则设置为空字符串,自然而然 ...
- C#图解教程 第二十五章 其他主题
其他主题 概述字符串使用 StringBuilder类把字符串解析为数据值关于可空类型的更多内容 为可空类型赋值使用空接合运算符使用可空用户自定义类型 Main 方法文档注释 插入文档注释使用其他XM ...
- javax顶层接口分析
1.Servlet接口分析 此接口是Servlet的最顶层接口,其中定义了Servlet生命周期相关的方法,所有Servlet都必须实现.此接口中的方法有以下几个: public void init( ...
- Bzoj4805: 欧拉函数求和
好久没写杜教筛了 练练手AC量刷起 # include <bits/stdc++.h> # define RG register # define IL inline # define F ...
- Bzoj2946:[POI2000] 最长公共子串
题面 求多个串的最长公共子串 Sol 套路,拼在一起,二分答案+后缀数组判定 把大于答案的\(height\)分组,然后计算出一个组内是否有所有串的后缀 由于串只有\(5\)个开个桶就好了 # inc ...
- C#多线程编程(6)--线程安全2 互锁构造Interlocked
在线程安全1中,我介绍了线程同步的意义和一种实现线程同步的方法:volatile.volatile关键字属于原子操作的一种,若对一个关键字使用volatile,很多时候会显得很"浪费&quo ...
- 从FCN到DeepLab
图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类. 图像语义分割,从FCN把深度学习引入这个任务,一个通用的框架事:前端使用FCN全卷积网络输出粗糙的label map,后端使用CR ...
- MySQL增量订阅&消费组件Canal POC
POC的目的:1.与MYSQL的对接方式,配置文档2.订阅的延迟3.订阅后宕机消息会不会丢失4.能不能从指定的点开始重新订阅5.高并发写入的时候,日志的顺序是否还能保持,不考虑消费的情况订阅是否会延迟 ...
- k60引脚图
/*! 枚举管脚编号 */ typedef enum { /* PTA端口 */ //0~31 PTA0, PTA1, PTA2, PTA3, PTA4, PTA5, PTA6, PTA7, PTA8 ...