使用Flask-SQLAlchemy管理数据库

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

安装Flask-SQLAlchemy

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

venv\Scripts\activate

命令行前出现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 \nFROM users \nWHERE 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()
posted @ 2018-02-01 12:59  McHades  阅读(611)  评论(0编辑  收藏  举报