使用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 ...
随机推荐
- FFMPEG 在ubuntu下的安装与使用
转载自 http://www.cnblogs.com/dwdxdy/p/3240167.html (部分一:安装) ffmpeg的安装: 1.下载源文件(以ffmpeg1.2.1为例): http:/ ...
- jquery实例权威指南
jquery的$(function(){}) 效率高于window.onload,前者页面框架加载完就执行,后者全部加载完毕且图片下载完毕后方可执行.且前者可以写多个,每次执行结果不同,后者的话尽管可 ...
- Luogu P1410 子序列
题目大意: 给定一个长度为\(N\)(\(N\)为偶数)的序列,] 问能否将其划分为两个长度为\(\frac{N}{2}\)的严格递增子序列, 输入一共有\(50\)组数据,每组数据保证\(N \le ...
- [BZOJ1657] [Usaco2006 Mar] Mooo 奶牛的歌声 (单调栈)
Description Farmer John's N (1 <= N <= 50,000) cows are standing in a very straight row and mo ...
- 【linux之链接,函数,随机数】
一.链接 硬链接(hard link):同一个文件使用了多个别名.新建文件是已经存在的一个别名,,当原文件删除时,新建的文件仍然可以使用.硬链接和原来的文件没有什么区别,而且共享一个inode号.通过 ...
- angular中$q.all用法
$q.all是用于执行多个异步任务进行回调,它可以接受一个promise的数组,或是promise的hash(object).任何一个promise失败,都会导致整个任务的失败. 例1:接受一个pro ...
- 设置ImageView显示的图片铺满全屏
转自:http://m.blog.csdn.net/blog/wjwj1203/32334459 为适应不同屏幕的手机,ImageView显示的图片可能不铺满屏幕,如果定高的话,两边可能会出现空白 ...
- python数据库连接池设计
一.背景: 传统访问资源,一般分为一下几个步骤: 1.实例数据驱动对象与链接资源.2.实例操作资源游标.3.获取资源.4.关闭链接资源. 根据以上步骤,我们可以很简单使用这个原始方法来访问资源为我们业 ...
- syskey——让你的电脑更加安全
我之前介绍过一个绕过系统登录密码的工具kon-boot,今天介绍的就是可以防止这个工具的方法,也能让你的电脑更加的安全. 这个方法也是我在Youtube上看见的一个方法,还是不错. 方法: win+R ...
- 基于synchronized实现的阻塞队列
package com.lilei.pack09; import java.util.concurrent.ExecutorService; import java.util.concurrent.E ...