美文网首页
Flask-SQLAlchemy

Flask-SQLAlchemy

作者: 睡不醒的大橘 | 来源:发表于2020-03-13 19:43 被阅读0次

    Flask-SQLALchemy 介绍

    • Flask-SQLAlchemy 是 Python Web 框架 Flask 的一个扩展,简化了在 Flask 中对 ORM 数据库框架 SQLAlchemy 的操作。
    • ORM,Object Relational Mapping,即对象关系映射。通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模型来操作数据库做替代。

    安装

    pip install Flask_SQLAlchemy
    

    基本使用

    #myapp.py
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///F:\\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, nullable=False)
        email = db.Column(db.String(120), unique=True, nullable=False)
    
        def __repr__(self):
            return '<User %r>' % self.username
    
    from myapp import db, User
    
    db.create_all()
    
    admin = User(username='admin', email='admin@example.com')
    guest = User(username='guest', email='guest@example.com')
    db.session.add(admin)
    db.session.add(guest)
    db.session.commit()
    
    print(User.query.all())
    #[<User 'admin'>, <User 'guest'>]
    print(User.query.filter_by(username='admin').first())
    #<User 'admin'>
    
    • 当继承db.Model的User类被声明后,会把表信息注册到db.Model.metadata.tables属性中。
    • create_all()被调用时,将会通过该属性来创建所有未被创建的表。已经被创建的表不会受影响。
    • 需注意,如果模型类在单独的模块中,需要对该模块进行导入,否则模型类就不会被创建,也无法把表信息注册到db.Model.metadata.tables属性中。

    表的增删改查

    # 原生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'})
    

    简单的关系

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///F:\\test.db'
    db = SQLAlchemy(app)
    
    
    from datetime import datetime
    
    
    class Post(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(80))
        body = db.Column(db.Text)
        pub_date = db.Column(db.DateTime)
    
        category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
        category = db.relationship('Category',
            backref=db.backref('posts', lazy='dynamic'))
    
        def __init__(self, title, body, category, pub_date=None):
            self.title = title
            self.body = body
            if pub_date is None:
                pub_date = datetime.utcnow()
            self.pub_date = pub_date
            self.category = category
    
        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))
    
        def __init__(self, name):
            self.name = name
    
        def __repr__(self):
            return '<Category %r>' % self.name
    
    from myapp import db, Category, Post
    
    db.create_all()
    py = Category('Python')
    p = Post('Hello Python!', 'Python is pretty cool', py)
    db.session.add(py)
    db.session.add(p)
    
    print(py.posts.all())
    #因为在 backref 中声明了 posts 作为动态关系,将输出:
    #[<Post 'Hello Python!'>]
    

    连接 URI 格式

    dialect+driver://username:password@host:port/database
    #MySQL
    mysql://scott:tiger@localhost/mydatabase
    #SQLite
    sqlite:////absolute/path/to/foo.db
    

    会话与事务

    session.flush()
    • 作用是在事务管理内与数据库发生交互, 对应的实例状态被反映到数据库,比如自增 ID 被填充上值,但是数据库中当前事务的数据值并未更新上;相当于预提交,等于提交到数据库内存,还未写入数据库文件;
    session.commit()
    • 直接将数据库内存中的数据提交到数据库,此操作会内部调用session.flush(),其余的事务可以访问最新的数据
    session.rollback()
    • 回滚当前事务的变更数据操作;

    相关文章

      网友评论

          本文标题:Flask-SQLAlchemy

          本文链接:https://www.haomeiwen.com/subject/uxqyshtx.html