1. 配置清单
配置键 |
说明 |
SQLALCHEMY_DATABASE_URI |
用于连接数据的数据库。例如:
sqlite:////tmp/test.db
mysql://username:password@server/db
|
SQLALCHEMY_BINDS |
一个映射绑定 (bind) 键到 SQLAlchemy 连接 URIs 的字典。用于绑定多个数据库 |
SQLALCHEMY_ECHO |
如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。 |
SQLALCHEMY_RECORD_QUERIES |
可以用于显式地禁用或者启用查询记录。查询记录 在调试或者测试模式下自动启用。更多信息请参阅 get_debug_queries() 。 |
SQLALCHEMY_NATIVE_UNICODE |
可以用于显式地禁用支持原生的 unicode。这是 某些数据库适配器必须的(像在 Ubuntu 某些版本上的 PostgreSQL),当使用不合适的指定无编码的数据库 默认值时。 |
SQLALCHEMY_POOL_SIZE |
数据库连接池的大小。默认是数据库引擎的默认值 (通常是 5)。 |
SQLALCHEMY_POOL_TIMEOUT |
指定数据库连接池的超时时间。默认是 10。 |
SQLALCHEMY_POOL_RECYCLE |
自动回收连接的秒数。这对 MySQL 是必须的,默认 情况下 MySQL 会自动移除闲置 8 小时或者以上的连接。 需要注意地是如果使用 MySQL 的话, Flask-SQLAlchemy 会自动地设置这个值为 2 小时。 |
SQLALCHEMY_MAX_OVERFLOW |
控制在连接池达到最大值后可以创建的连接数。当这些额外的 连接回收到连接池后将会被断开和抛弃。 |
SQLALCHEMY_TRACK_MODIFICATIONS |
如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。 |
Flask项目中,一般使用单独的文件存储配置(如:config.py),应用程序可以使用from_object()来获取配置信息
2. 声明模型
db = SQLAlchemy()
class User(db.Model):
__tablename__ = 'user'
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 '' % self.username
列类型 |
说明 |
Integer |
一个整数 |
String (size) |
有长度限制的字符串 |
Text |
一些较长的 unicode 文本 |
DateTime |
表示为 Python datetime 对象的 时间和日期 |
Float |
存储浮点值 |
Boolean |
存储布尔值 |
PickleType |
存储为一个持久化的 Python 对象 |
LargeBinary |
存储一个任意大的二进制数据 |
选项名 |
说明 |
primary_key |
如果设为True,表示主键 |
unique |
如果设为True,这列不重复 |
index |
如果设为True,创建索引,提升查询效率 |
nullable |
如果设为True,允许空值 |
default |
为这列定义默认值,可以接受lambda表达式 |
3. CRUD
a. 插入记录
向数据库插入数据分为三个步骤:
- 创建 Python 对象
- 把它添加到会话
- 提交会话
>>> from yourapp import User
>>> me = User('admin', '[email protected]')
>>> db.session.add(me)
>>> db.session.commit()
b. 删除记录
>>> db.session.delete(me)
>>> db.session.commit()
c. 查询记录
Flask-SQLAlchemy 在您的 Model 类上提供了 query 属性。当您访问它时,您会得到一个新的所有记录的查询对象。
>>> peter = User.query.filter_by(username='peter').first()
>>> peter.id
1
>>> peter.email
u'[email protected]'
SQLAlchemy有查询过滤器如下:
过滤器 |
说明 |
filter() |
把过滤器添加到原查询,返回新查询 |
filter_by() |
把等值过滤器添加到原查询,返回新查询 |
limit() |
使用指定值限制原查询返回的结果数量,返回新查询 |
offset() |
偏移原查询返回的结果,返回新查询 |
order_by() |
排序返回结果,返回新查询 |
groupby() |
原查询分组,返回新查询 |
这些过滤器返回的结果都是一个新查询,这些查询其实是生成的SQL语句,惰性求值方式也体现在查询上,而这些语句不能生成需要查询的对象,需要调用其他的方法生成对象。
SQL查询执行函数:
方法 |
说明 |
all() |
以列表形式返回结果 |
first() |
返回第一个结果,如果没有返回None |
first_or_404() |
返回第一个结果,如果没有抛出404异常 |
get() |
返回主键对应记录,没有则返回None |
get_or_404() |
返回主键对应记录,如果没有抛出404异常 |
count() |
返回查询结果数量 |
paginate() |
返回paginate对象,此对象用于分页 |
4.绑定多个数据库
下面的配置声明了三个数据库连接。特殊的默认值和另外两个分别名为 users`(用于用户)和 `appmeta 连接到一个提供只读访问应用内部数据的 sqlite 数据库):
SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'
SQLALCHEMY_BINDS = {
'users': 'mysqldb://localhost/users',
'appmeta': 'sqlite:////path/to/appmeta.db'
}
create_all() 和 drop_all() 方法默认作用于所有声明的绑定(bind),包括默认的。这个行为可以通过提供 bind 参数来定制。
>>> db.create_all()
>>> db.create_all(bind=['users'])
>>> db.create_all(bind='appmeta')
>>> db.drop_all(bind=None)
当您声明模型时,您可以用 __bind_key__ 属性指定绑定(bind):
class User(db.Model):
__bind_key__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
如果您在模型上指定了 __bind_key__ ,您可以用它们准确地做您想要的。模型会自行连 接到指定的数据库连接。
5. 数据迁移
创建管理文件manage.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand
db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object(config[config_name])
db.init_app(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
manager.run()
manager使用说明:
命令格式:
python manager.py db [command]
command说明:
init-初始化数据库迁移(自动生成migrations目录及文件),仅在第一次使用
migrate-生成迁移数据,自动根据model变化生成迁移数据文件,含版本控制
upgrade-执行升级操作,将变动的表结构提交到数据库,保留数据库原数据
downgrade-执行降级操作, 相当于撤回本次升级操作