使用Flask-SQLAlchemy管理数据库

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

安装Flask-SQLAlchemy

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

venv\Scripts\activate

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

  而后,安装Flask-SQLAlchemyshell

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 类,类中的属性对应数据库表中的列。flask

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 类构造函数的第一个参数是数据库列和模型属性的类型。session

操做数据库

建立表

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

(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()
相关文章
相关标签/搜索