zoukankan      html  css  js  c++  java
  • 使用Flask-SQLAlchemy管理数据库

    SQLAlchemy 是一个很强大的关系型数据库框架,处于数据库抽象层 ,支持多种数据库后台。 提供了高层 ORM,也提供了使用数据库原生 SQL 的低层功能。

    安装Flask-SQLAlchemy

      首先,激活virtualenv虚拟环境,在虚拟环境安装目录的同级目录下使用命令

    venvScriptsactivate
    
    

    命令行前出现virtualenv 则表示激活成功

      然后,安装Flask-SQLAlchemy

    pip install flask-sqlalchemy
    
    

    配置SQLite数据库

    from flask.ext.sqlalchemy import SQLAlchemy
    
    basedir = os.path.abspath(os.path.dirname(__file__))
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] =
    'sqlite:///' + os.path.join(basedir, 'data.sqlite')
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    
    db = SQLAlchemy(app)
    
    

    db 对象:是 SQLAlchemy 类的实例,表示程序使用的数据库,同时还获得了 Flask-SQLAlchemy
    提供的所有功能。
    SQLALCHEMY_DATABASE_URI :程序使用的数据库 URL
    SQLALCHEMY_COMMIT_ON_TEARDOWN :将其设为 True 时,每次请求结束后都会自动提交数据库中的变动

    定义模型

    在 ORM 中,模型一般是一个 Python 类,类中的属性对应数据库表中的列。

    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(64), unique=True, index=True)
    
        def __repr__(self):
        return '<User %r>' % self.username
    

    __tablename__ :定义在数据库中使用的表名。如果没有定义 tablename,Flask-SQLAlchemy 会使用一个默认名字。
    其余的类变量都是该模型的属性,被定义为 db.Column类的实例。db.Column 类构造函数的第一个参数是数据库列和模型属性的类型。

    操作数据库

    创建表

    让 Flask-SQLAlchemy 根据模型类创建数据库。方法是使用 db.create_all() 函数:

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

    查看程序目录,会发现新建了一个名为 data.sqlite 的文件。如果数据库表已经存在于数据库中,那么 db.create_all()不会重新创建或者更新这个表。如果修改模型后要把改动应用到现有的数据库中,这一特性会带来不便。粗暴的解决方式是先删除再重建使用>>> db.drop_all()>>> db.create_all(),数据库里的数据也会被删除。所以使用 Flask-Migrate插件,这个插件对数据库迁移框架Alembic 做了轻量级包装,并集成到 Flask-Script 中,所有操作都通过 Flask-Script 命令完成。接下来的操作前提是安装并使用了Flask-Migrate。
    备注: 使用Flask-Migrate后,为表新增字段后必须经过一下两条命令才能使新模型生效

    (venv) $ python hello.py db migrate -m "initial migration"  #自动创建迁移脚本
    
    (venv) $ python hello.py db upgrade      #更新数据库,且不影响其中保存的数据
    

    查询

    模型名.query.all()取对应表中的所有记录:

    >>> User.query.all()
    [<User u'john'>]
    
    

    可通过查看原生语句查看该表的字段

    >>> str(User.query)
    'SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.role_id AS users_role_id, users.password_hash AS users_password_hash, users.confirmed AS users_confirmed 
    FROM users 
    WHERE users.username = ?'
    
    

    可以看到模型User对应的表users中的字段有,id, email, username, role_id等

    修改

    先取到数据再修改然后将修改存回表中

    >>> User.query.get(1)
    <User u'john'>
    
    >>> u=User.query.get(1)  #取数据
    
    >>> print u.email
    john@example.com
    
    >>> u.email='john@qq.com'  #修改数据
    >>> db.session.add(u)     #添加
    >>> db.session.commit()  #提交修改
    >>> User.query.get(1).email                     #查看修改后数据
    u'john@qq.com'
    
    

    删除

    >>> db.session.delete(u)
    >>> db.session.commit()
    
    

    插入行

    >>> u = User(email='john@example.com', username='john', password='cat')
    >>> db.session.add(u)
    >>> db.session.commit()
    
  • 相关阅读:
    136. Single Number
    125. Valid Palindrome
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    119. Pascal's Triangle II
    118. Pascal's Triangle
    集中式架构与分布式架构比较-copy
    分布式id产生-copy
    MySQL 5.7数据库参数优化-copy
    23个适合Java开发者的大数据工具和框架-copy
  • 原文地址:https://www.cnblogs.com/liminghuang/p/8398461.html
Copyright © 2011-2022 走看看