Flask-SQLAlchemy 使用

默北 pythonFlask-SQLAlchemy 使用已关闭评论14,3062字数 2750阅读9分10秒阅读模式

安装

pip install flask-sqlalchemy
pip install MySQL-python

需要先安装mysql开发库的。

使用

创建SQLALchemy 对象, 然后再 绑定Flask文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

from flask_sqlalchemy import SQLALchemy
from flask import Flask
app = Flask(__name__)
db = SQLALchemy()
db.init_app(app)

指定SQLALchemy URI文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>"

定义模型

使用 ORM 就肯定要定义对象的文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

class Users(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String, unique=True)
    username = db.Column(db.String, unique = True)
    passwd = db.Column(db.String)
    date = db.Column(db.DateTime)


class Users_detail(db.Model):
    __tablename__ = 'users_detail'

    id = db.Column(db.Integer, primary_key=True)
    uid = db.Column(db.Integer,unique=True)
    age = db.Column(db.Integer)
    sex = db.Column(db.SmallInteger)
    location = db.Column(db.String)
    intro = db.Column(db.Text)
    todo = db.Column(db.Text)
    modifytime = db.Column(db.DateTime)
    inserttime = db.Column(db.DateTime)

从这两个例子可以看到,定义一列是需要使用 db.Column 的,然后需要指定数据类型,还有列的选项,常用的数据类型有:文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

类型名 Python 类型 说明
Integer int 普通整数,一般是32位
SmallInteger int 取值范围小的整数,一般是 16 位
BigInteger int 或 long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 定点数
String str 变长字符串
Text str 编程字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长 Unicode 字符串
UnicodeText unicode 变长 Unicode 字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
Interval datetime.timedelta 时间间隔
Enum str 一组字符串
PickleType 任何 python 对象 自动使用 Pickle 序列化
LargeBinary str 二进制文件

而一些常用的 SQLAlchemy文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

列选项: 选项名 说明
primary_key 如果设为 True,这列就是表的主键
unique 如果设为 True,这列不允许出现重复的值
index 如果设为 True,为这列创建索引,提升查询效率
nullable 如果设为 True,这列允许使用空值,如果设为 False,这列不允许使用空值
default 为这列定义默认值

数据库操作

数据库的操作不外乎就是增删改查,所以这里就介绍一下增删改查怎么做,和其他 ORM(例如 MongoEngine) 不一样,SQLAlchemy使用之前需要先创建表和数据库才能操作数据。 所以第一步是创建表文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

$ python app.py shell
    >>> from app import db
    >>> db.create_all()

插入数据文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

from app import db, Users, Users_detail
from datetime import datetime
user = User(email='ttlsa@ttlsa.com',username='ttlsa',passwd='ttlsa',date=datetime.now())
user_detail = Users_detail(XXXXX)  #自己补齐去吧

# 下面这个很重要
db.session.add(user)
db.session.add(user_detail)
db.session.commit()

这里需要提一下的就是 db.session,这个 session 是数据库中 事务的含义,因此我们可以提交修改数据,也可以回滚取消修改。文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

修改数据文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

users = Users(username="ttlsa2")
db.session.add(user)
db.session.commit()

修改只需要修改属性并提交就行了。文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

删除数据文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

db.session.delete()
db.session.commit()

删除数据直接调用 delete 方法即可,记得 commit。文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

查询数据文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

查询数据稍微复杂一下文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

  • 获得查询对象
  • 添加过滤条件
  • 如果还有其他分组之类的,继续添加
Users.query.all()
Users.query.filter_by(id=1)

这里的 filter_by 叫做过滤器,常用的过滤器有文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

过滤器 说明
filter 把过滤器添加到原查询上,返回一个新查询
filter_by 把等值过滤器添加到原查询上,返回一个新查询
limit  使用指定的值限制返回的结果数量,返回一个新查询
offset 便宜原查询返回的结果, 返回一个新查询
order_by 根据指定条件对原查询结果进行排序,返回一个新查询
group_by 根据指定条件对原查询结构进行分组,返回一个新查询

如果后面不加.all(),那么其实是不会真正到数据库执行的,类似 all 的执行器还有很多,常用的有:文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

方法 说明
all 以列表形式返回查询的所有结果
first 返回查询的第一个结果,如果没有结果,则返回 None
first_or_404 返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误输出
get 返回指定主键对应的行,如果没有对应的行,则返回 None
get_or_404 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误输出
count 返回查询结果的数量
paginate 返回一个 Paginate 对象,它包含指定范围内的结果

获取更多可以查看 《SQLAlchemy QueryAPI》文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/ 文章源自运维生存时间-https://www.ttlsa.com/python/flask-sqlalchemy-using/

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北
  • 本文由 发表于 09/10/2016 10:15:08
  • 转载请务必保留本文链接:https://www.ttlsa.com/python/flask-sqlalchemy-using/