这里我们以mysql为例
连接数据库:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"]="mysql+pymysql://username:password@host/dbname
定义模型,以日记表为例
class Note(db.Model):
id = db.Column(db.Integer,primary_key=True)
body = db.Column(db.Text)
本文使用Python Shell演示flasl对数据库的增删改查
一、增
添加一条新纪录到数据库主要分为3步:
- 创建Python对象(实例化模型类)作为一条记录
- 添加新创建的记录到数据库会话
- 提交数据库会话
下面的示例向数据库中添加三条Note:
>>>from app import db,Note
>>>note1 = Note(body='1111111')
>>>note2 = Note(body='2222222')
>>>note3 = Note(body='3333333')
>>>db.session.add(note1)
>>>db.session.add(note1)
>>>db.session.add(note1)
>>>db.session.commit()
##除了依次调用add()的方法添加多条记录,也可以使用add_all()一次添加所有。
在这个示例中,我们首先从app 模块导人db对象和 Note 类,然后分别创建三个Note实例表示三条记录,使用关键字参数传人字段数据。我们的 Note 类继承自 db.Model 基类, db.Model基类会为 Note 类提供一个构造函数,接收匹配类属性名称的参数值,并赋值给对应的类属性,所以我们不需要自己在 Note 类中定义构造方法 。接着我们调用 add()方法把这三个 Note 对象添加到会话对象 db.session 中,最后调用 commit()方法提交会话 。
刚才创建的表结构如下:
id | body |
1 | 111111111 |
2 | 22222222 |
3 | 33333333 |
二、查
一般来说,一个完整的查询遵循下面的模式 :
<模型类>.query. <过滤方法>.<查询方法>
Flask-SQLAlchemy常用查询方法
查询方法 | 说明 |
all() | 返回包含所有查询记录的列表 |
first() | 返回查询的第一条记录,如果未找到,则返回 None |
one() | 返回第一条记录,且仅允许有一条记录 。 如果记录数量大于 1 或小于 1, 则抛出错误 |
get(id) | 传入主键值作为参数,返回指定主键值的记录,如果未找到, 则返回 None |
count() | 返回查询结果的数量 |
one_or_none() | 类似one(),如果结果数量不为1,返回 None |
first_or_404() | 返回查询的第一条记录,如果未找到,则返回 404 错误响应 |
get_or_404(id) | 传入主健值作为参数,返回指定主键值的记录,如果未找到,则返回 404 错误响应 |
paginate() | 返回一个 Pagination 对象,可以对记录进行分页处理 |
with_parent(instance) | 传人模型类实例作为参数 , 返回和这个实例相关联的对象 |
下面是对Note类进行查询的几个示例
#all() 返回所有记录 :
>> Note .query. all {)
(<Note u '111111111111' >, <Note u ’2222222222222' >, <Note u '3333333333333'>]
#first()返回第一条记录 :
>> notel =Note.query.first ()
>> notel
<Note u '1111111111111' >
>> notel.body
u'1111111111111'
#get()返回指定主键值(id 字段) 的记录 :
>> note2 = Note.query.get(2)
>> note2
<Note u '2222222222222'>
#count()返回记录的数量 :
>> Note.query.count ()
3
SQLAlcherny 还提供了许多过滤方法,使用这些过滤方法可以获取更精确的查询,比如获取指定字段值的记录 。 对模型类的 query 属性存储的 Query 对象调用过滤方法将返回一个更精确的 Query 对象(后面我们简称为查询对象)。因为每个过滤方法都会返回新的查询对象,所以过滤器可以叠加使用 。 在查询对象上调用前面介绍的查询方法,即可获得一个包含过滤后的记录的列表 。
过滤方法 | 说明 |
filter() | 使用指定的规则过滤记录 ,返回新产生的查询对象 |
filter_by() | 使用指定规则过滤记录( 以关键字表达式的形式),返回新产生的查询对象 |
order_by() | 根据指定条件对记录进行排序,返回新产生的查询对象 |
limit(limit) | 使用指定的值限制原查询返回的记录数量,返回新产生的查询对象 |
group_by() | 根据指定条件对记录进行分组,返回新产生的查询对象 |
offset(offset) | 使用指定的值偏移原查询的结果,返回新产生的查询对象 |
filter()方法是最基础的查询方法 。 它使用指定的规则来过滤记录,下面的示例在数据库里找出了 body 字段值为“ 11111111111 ”的记录:
>> Note.query.filter(Note.body==’11111111111’ ).first()
<Note u ’11111111111’ >
在 filter()方法中传入表达式时,除了“==”以及表示不等于的“ !=”,其他常用的查询操作符以及使用示例如下所示:
LIKE:
filter(Note.body.like('%111%'))
IN:
filter(Note.body.in([’11’,’11111’,’1111111’]))
NOT IN:
filter(~Note.body.in([’22’,’33’]))
AND:
#使用 and ()
from sqlalchemy import and_
filter(and_(Note.body==’1’,Note.title ==’1111111111’))
#或在filter()中加入多个表达式,使用逗号分隔
filter(Note.body==’1’,Note.title ==’1111111111’)
#或叠加调用多个filter()/filter_by()方法
filter(Note.body==’foo’).filter(Note.title ==’1111111111’ )
OR:
from sqlalchemy import or_
filter(or_(Note.body=='1',Note.body=='2'))
和 filter()方法相比,filter_by()方法更易于使用 。 在filter_by()方法中,你可以使用关键字表达式来指定过滤规则 。 更方便的是,你可以在这个过滤器中直接使用字段名称 。下面的示例使用 filter_by()过滤器完成了同样的任务:
>> Note.query.filter_by (body=’11111111111’) . first()
<Note u '11111111111' >
三、改
更新一条记录非常简单,直接赋值给模型类的字段属性就可以改变字段值,然后调用commit()方法提交会话即可 。 下面的示例改变了一条记录的 body 字段的值 :
>> note= Note.query.get(2)
>> note.body
u '22222222222222'
>> note.body = '2++++'
>> db.session.commit()
四、删
删除记录和添加记录很相似 ,不过要把 add()方法换成 delete()方法,最后都需要调用commit()方法提交修改 。下面的示例删除了 id(主键)为 2 的记录:
>> note = Note.query.get (2)
>>> db.session.delete(note)
>> db.session.commit()
补充
对于增删改的commit()命令,可以通过添加配置的方式来自动提交修改,而不用每次都敲commit。
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True