zoukankan      html  css  js  c++  java
  • 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'})
  • 相关阅读:
    Java实现 计蒜客 拯救行动
    Java实现 计蒜客 拯救行动
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 173 二叉搜索树迭代器
    Java实现 LeetCode 173 二叉搜索树迭代器
    Visual Studio的SDK配置
    怎样使用CMenu类
    mfc menu用法一
  • 原文地址:https://www.cnblogs.com/xiondun/p/13640181.html
Copyright © 2011-2022 走看看