Flask-SQLAlchemy学习总结

来源:互联网 发布:fx3u一48编程手册书 编辑:程序博客网 时间:2024/06/05 18:44

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 '<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. 提交会话
>>> from yourapp import User>>> me = User('admin', 'admin@example.com')>>> 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.id1>>> peter.emailu'peter@example.org'
SQLAlchemy有查询过滤器如下:
过滤器说明filter()把过滤器添加到原查询,返回新查询filter_by()把等值过滤器添加到原查询,返回新查询limit()使用指定值限制原查询返回的结果数量,返回新查询offset()偏移原查询返回的结果,返回新查询order_by()排序返回结果,返回新查询groupby()原查询分组,返回新查询这些过滤器返回的结果都是一个新查询,这些查询其实是生成的SQL语句,惰性求值方式也体现在查询上,而这些语句不能生成需要查询的对象,需要调用其他的方法生成对象。
SQL查询执行函数:
方法说明all()以列表形式返回结果first()返回第一个结果,如果没有返回Nonefirst_or_404()返回第一个结果,如果没有抛出404异常get()返回主键对应记录,没有则返回Noneget_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 Flaskfrom flask_sqlalchemy import SQLAlchemyfrom flask_script import Manager, Shellfrom flask_migrate import Migrate, MigrateCommanddb = 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-执行降级操作, 相当于撤回本次升级操作
原创粉丝点击