Flask-SQLAlchemy总结

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. 声明模型

 
  1. db = SQLAlchemy()

  2. class User(db.Model):

  3. __tablename__ = 'user'

  4.  
  5. id = db.Column(db.Integer, primary_key=True)

  6. username = db.Column(db.String(80), unique=True)

  7. email = db.Column(db.String(120), unique=True)

  8.  
  9. def __init__(self, username, email):

  10. self.username = username

  11. self.email = email

  12.  
  13. def __repr__(self):

  14. return '<User %r>' % 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. 插入记录

向数据库插入数据分为三个步骤:

  1. 创建 Python 对象
  2. 把它添加到会话
  3. 提交会话
 
  1. >>> from yourapp import User

  2. >>> me = User('admin', 'admin@example.com')

  3. >>> db.session.add(me)

  4. >>> db.session.commit()

b. 删除记录

 
  1. >>> db.session.delete(me)

  2. >>> db.session.commit()

c. 查询记录

Flask-SQLAlchemy 在您的 Model 类上提供了 query 属性。当您访问它时,您会得到一个新的所有记录的查询对象。

 
  1. >>> peter = User.query.filter_by(username='peter').first()

  2. >>> peter.id

  3. 1

  4. >>> peter.email

  5. u'peter@example.org'

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 数据库): 

 
  1. SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'

  2. SQLALCHEMY_BINDS = {

  3. 'users': 'mysqldb://localhost/users',

  4. 'appmeta': 'sqlite:path/to/appmeta.db'

  5. }

create_all() 和 drop_all() 方法默认作用于所有声明的绑定(bind),包括默认的。这个行为可以通过提供 bind 参数来定制。

 
  1. >>> db.create_all()

  2. >>> db.create_all(bind=['users'])

  3. >>> db.create_all(bind='appmeta')

  4. >>> db.drop_all(bind=None)

当您声明模型时,您可以用 __bind_key__ 属性指定绑定(bind):

 
  1. class User(db.Model):

  2. __bind_key__ = 'users'

  3. id = db.Column(db.Integer, primary_key=True)

  4. username = db.Column(db.String(80), unique=True)

如果您在模型上指定了 __bind_key__ ,您可以用它们准确地做您想要的。模型会自行连 接到指定的数据库连接。 

5. 数据迁移

创建管理文件manage.py

 
  1. from flask import Flask

  2. from flask_sqlalchemy import SQLAlchemy

  3. from flask_script import Manager, Shell

  4. from flask_migrate import Migrate, MigrateCommand

  5.  
  6. db = SQLAlchemy()

  7. app = Flask(__name__)

  8. app.config.from_object(config[config_name])

  9. db.init_app(app)

  10. migrate = Migrate(app, db)

  11. manager = Manager(app)

  12. manager.add_command('db', MigrateCommand)

  13. manager.run()

manager使用说明: 
命令格式: python manager.py db [command] 

command说明:

init-初始化数据库迁移(自动生成migrations目录及文件),仅在第一次使用

migrate-生成迁移数据,自动根据model变化生成迁移数据文件,含版本控制

upgrade-执行升级操作,将变动的表结构提交到数据库,保留数据库原数据

downgrade-执行降级操作, 相当于撤回本次升级操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值