使用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 ...
随机推荐
- 端口被占用:android studio 虚拟机adb.exe已停止工作的处理
浏览:2190 | 更新:2017-09-16 05:00 1 2 3 4 5 6 分步阅读 在搭建android studio开发环境后,开始编程调试程序时,不管运行虚拟机还是真机,都不停出现&qu ...
- 2.3.2 InnoDB内存
前面介绍了一些InnoDB的体系架构(http://www.cnblogs.com/tanwt/p/8530987.html) 接下来介绍一下InnoDB 的内存 1.缓冲池 首先我们需要了解的是In ...
- CF484E Sign on Fence
题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于 ...
- [BZOJ1022] [SHOI2008] 小约翰的游戏John (SJ定理)
Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...
- VS快速注释
注释:Ctrl+k + Ctrl+c 去注释:Ctrl+k + Ctrl +u
- PHP面试和PHP开发者都应掌握的10个问题
PHP面试和PHP开发者都应掌握的10个问题 问题 :1 MySQL里的存储引擎有什么不同,哪一个是默认的? 答案: 1 我们可以一下存储引擎: 1. MyISAM(MySQL的默认引擎. 每个MyI ...
- leetCode:461 汉明距离
汉明距离 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 思路: 当看到"对应二进制位不同的位置的数目"这 ...
- 使用jquery-panzoom来实现图片或元素的放大缩小
1. html <div class="wrapper"> <a class="btn btn-md" ui-turn-off="A ...
- WPF 16进制byte输入框
在WPF中,针对byte类型的输入控件可以选用 XCEED 的免费库中的 Xceed.Wpf.Toolkit.ByteUpDown(可从nuget获取). 若要使该控件在界面上以16进制显示byte, ...
- Linux快速搭建FTP服务器
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(A ...