• Flask-SQLAlchemy详解


    Flask-SQLAlchemy详解

     

    flask中一般使用flask-sqlalchemy来操作数据库,使用起来比较简单,易于操作。

    安装

    pip install flask-sqlalchemy
    

    配置

    配置选项说明
    SQLALCHEMY_DATABASE_URI 连接数据库。示例:mysql://username:password@host/post/db?charset=utf-8
    SQLALCHEMY_BINDS 一个将会绑定多种数据库的字典。 更多详细信息请看官文 绑定多种数据库.
    SQLALCHEMY_ECHO 调试设置为true
    SQLALCHEMY_POOL_SIZE 数据库池的大小,默认值为5。
    SQLALCHEMY_POOL_TIMEOUT 连接超时时间
    SQLALCHEMY_POOL_RECYCLE 自动回收连接的秒数。
    SQLALCHEMY_MAX_OVERFLOW 控制在连接池达到最大值后可以创建的连接数。当这些额外的 连接回收到连接池后将会被断开和抛弃。
    SQLALCHEMY_TRACK_MODIFICATIONS 如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。

    操作数据库需要先创建一个db对象,通常写在exts.py文件里。

    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    

    flask项目一般将数据库配置写入configs.py文件里面,配置在创建引擎前需写好,不要在程序运行时修改配置,如下。

    HOST = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'flask1'
    USERNAME = 'root'
    PASSWORD = '123456'
    
    DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD, host=HOST,port=PORT, db=DATABASE)
    
    SQLALCHEMY_DATABASE_URI = DB_URI
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = True
    

    写完数据库配置后需要和app绑定,app.py文件里写flask应用的创建和蓝图的注册等等,如下:

    from flask import Flask
    import configs
    from exts import db
    
    app = Flask(__name__)
    # 加载配置文件
    app.config.from_object(configs)
    # db绑定app
    db.init_app(app)
    

    模型

    数据类型说明
    Integer 整型
    String 字符串
    Text 文本
    DateTime 日期
    Float 浮点型
    Boolean 布尔值
    PickleType 存储一个序列化( Pickle )后的Python对象
    LargeBinary 巨长度二进制数据
    1.表的创建
    # 建表写在models.py文件里面
    from ext import db
    
    """
    以下表关系:
    一个用户对应多篇文章(一对多)
    一篇文章对应多个标签,一个标签对应多个文章(多对多)
    """
    """
    一对一关系中,需要设置relationship中的uselist=Flase,其他数据库操作一样。
    一对多关系中,外键设置在多的一方中,关系(relationship)可设置在任意一方。
    多对多关系中,需建立关系表,设置 secondary=关系表
    """
    
    # 用户表
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        username = db.Column(db.String(50))
        email = db.Column(db.String(50))
    
    # 关系表(多对多)
    article_tag_table = db.Table('article_tag',
                                 db.Column('article_id', db.Integer, db.ForeignKey('article.id'), primary_key=True),
                                 db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True))
    
    # 文章表
    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        title = db.Column(db.String(100))
        content = db.Column(db.Text)
        author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    
        author = db.relationship("User", backref="articles")
        tags = db.relationship("Tag", secondary=article_tag_table, backref='tags')
    
    # 标签表
    class Tag(db.Model):
        __tablename__ = 'tag'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(50))
    
    
    2.表的映射

    创建好表后需要映射到数据库中,这里需要用到flask-migrate库。下面是启动文件manage.py

    from flask_script import Manager, Server
    from app import app
    from flask_migrate import Migrate, MigrateCommand
    from ext import db
    from first import models # 模型文件必须导入进来,否则运行报错
    
    manager = Manager(app)
    Migrate(app=app, db=db)
    manager.add_command('db', MigrateCommand) # 创建数据库映射命令
    manager.add_command('start', Server(port=8000, use_debugger=True)) # 创建启动命令
    
    if __name__ == '__main__':
        manager.run()
    

    配置好启动文件后,进入项目根目录,在命令行输入以下代码:

    >python manage.py db init
    >python manage.py db migrate
    >python manage.py db upgrade
    
    3.表的增删查改
    # 原生sql语句操作
    sql = 'select * from user'
    result = db.session.execute(sql)
    
    # 查询全部
    User.query.all()
    # 主键查询
    User.query.get(1)
    # 条件查询
    User.query.filter_by(User.username='name')
    # 多条件查询
    from sqlalchemy import and_
    User.query.filter_by(and_(User.username =='name',User.password=='passwd'))
    # 比较查询
    User.query.filter(User.id.__lt__(5)) # 小于5
    User.query.filter(User.id.__le__(5)) # 小于等于5
    User.query.filter(User.id.__gt__(5)) # 大于5
    User.query.filter(User.id.__ge__(5)) # 大于等于5
    # in查询
    User.query.filter(User.username.in_('A','B','C','D'))
    # 排序
    User.query.order_by('age') # 按年龄排序,默认升序,在前面加-号为降序'-age'
    # 限制查询
    User.query.filter(age=18).offset(2).limit(3)  # 跳过二条开始查询,限制输出3条
    
    # 增加
    use = User(id,username,password)
    db.session.add(use)
    db.session.commit() 
    
    # 删除
    User.query.filter_by(User.username='name').delete()
    
    # 修改
    User.query.filter_by(User.username='name').update({'password':'newdata'})
  • 相关阅读:
    Codeforces 938G(cdq分治+可撤销并查集+线性基)
    codeforces 938F(dp+高维前缀和)
    寒武纪camp Day6
    寒武纪camp Day5
    寒武纪camp Day4
    bzoj4161 (k^2logn求线性递推式)
    loj10003加工生产调度
    loj10002喷水装置
    loj10001种树
    bzoj1023
  • 原文地址:https://www.cnblogs.com/xiondun/p/13640181.html
Copyright © 2020-2023  润新知