• Flask-SQLAlchemy使用


    Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展。
    官方文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/
    中文文档:http://www.pythondoc.com/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 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。

    创建及查询

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
    db = SQLAlchemy(app)
    
    
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(80), unique=True)
        email = db.Column(db.String(120), unique=True)
    
        def __init__(self, username, email):
            self.username = username
            self.email = email
    
        def __repr__(self):
            return '<User %r>' % self.username
    
    if __name__ == '__main__':
        # 创建初始数据
        db.create_all()
        # 创建一些用户
        admin = User('admin', 'admin@example.com')
        guest = User('guest', 'guest@example.com')
        # 写入到数据库
        db.session.add(admin)
        db.session.add(guest)
        db.session.commit()
        # 访问数据库
        users = User.query.all()
        admin = User.query.filter_by(username='admin').first()
        print(users)
        print(admin)
    

    结果:

    [<User 'admin'>, <User 'guest'>]
    <User 'admin'>
    

    表关联

    SQLAlchemy 连接到关系型数据库,关系型数据最擅长的东西就是关联。因此,我们将创建一个使用两张相互关联的表的应用作为例子:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from datetime import datetime
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
    db = SQLAlchemy(app)
    
    
    class Post(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(80), nullable=False)
        body = db.Column(db.Text, nullable=False)
        pub_date = db.Column(db.DateTime, nullable=False,
                             default=datetime.utcnow)
    
        category_id = db.Column(db.Integer, db.ForeignKey('category.id'), # 外键
                                nullable=False)
    
        # 与生成表结构无关,仅用于查询方便
        # backref 标示可通过relationship反向查找,Category.posts查询Post表数据
        category = db.relationship('Category',
                                   backref=db.backref('posts', lazy=True))
    
        def __repr__(self):
            return '<Post %r>' % self.title
    
    
    class Category(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50), nullable=False)
    
        def __repr__(self):
            return '<Category %r>' % self.name
    
    
    if __name__ == '__main__':
        # 创建一些对象
        py = Category(name='Python')
        Post(title='Hello Python!', body='Python is pretty cool', category=py)
        p = Post(title='Snakes', body='Ssssssss')
        py.posts.append(p)
        db.session.add(py)
    
        # 现在因为我们在 backref 中声明了 posts 作为动态关系,查询显示为:
        print(py.posts)
    

    运行结果:

    [<Post 'Hello Python!'>, <Post 'Snakes'>]
    

    更多数据库的增删改查等功能参考官方文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/

    如果您觉得本篇文章还不错,欢迎点赞,转发分享(转发请注明出处),感谢~~
  • 相关阅读:
    liunx 利用管道线kill多个进程
    将多个学生平均分配到多个学校的方法示例
    mysql 根据查询条件进行update
    Mysql 使用临时表比较数据差异以及 临时表的优化
    Netcore 将汉字转化为拼音
    mysql 清除多列重复数据,只保留其中一条
    使用Mysql 存储过程和游标进行同步数据
    Culture is not supported. (Parameter 'name') u0002� is an invalid culture identifier.
    Swagger 过滤特定控制器配置方法(Swashbuckle.AspNetCore 5.0.0)
    System.Linq Distinct 方法使用
  • 原文地址:https://www.cnblogs.com/feng0815/p/14492772.html
Copyright © 2020-2023  润新知