Flask中的全局变量
current_app 程序上下文 当前激活程序的程序实例
g 程序上下文 当前请求时程序实例
request 请求上下文 请求对象,封装了客户端发的http请求中的内容
session 请求上下文 用户会话,用于存储请求之间需要记住的值的词典
flask 中的钩子函数
- before_first_request
- before_request
- after_request
- teardown_request
钩子函数的典型的应用场景是:
在一次请求中通过before_first_request来获取到用户数据存储到Context中,以后的请求就可以直接从Context中获取到用户的数据了
SQLAlchemy有查询过滤器如下:
过滤器 | 说明 |
---|---|
filter() | 把过滤器添加到原查询,返回新查询 |
filter_by() | 把等值过滤器添加到原查询,返回新查询 |
limit() | 使用指定值限制原查询返回的结果数量,返回新查询 |
offset() | 偏移原查询返回的结果,返回新查询 |
order_by() | 排序返回结果,返回新查询 |
groupby() | 原查询分组,返回新查询 |
all() | 以列表形式返回结果 |
first() | 返回第一个结果,如果没有返回None |
first_or_404() | 返回第一个结果,如果没有抛出404异常 |
get() | 返回主键对应记录,没有则返回None |
get_or_404() | 返回主键对应记录,如果没有抛出404异常 |
count() | 返回查询结果数量 |
paginate() | 返回paginate对象,此对象用于分页 传入参数(index,limit) |
filter指定列名的时候,可以不使用类名;filter_by也不是说任何时候都可以不指定类名 我平时使用的时候,两者区别主要就是当使用filter的时候条件之间是使用“==",fitler_by使用的是"="。 user1 = session.query(User).filter_by(id=1).first() user1 = session.query(User).filter(id==1).first()
利用 Flask-sqlalchemy 求列表的和
li = [1,2,3,4]
sum_cash = db.session.query(func.sum(TUserloanLog.change_cash)).filter(and_(TUserloanLog.change_reason == 4,TUserloanLog.id.in_(li)))
最后的sum_cash 是 id 在 li 里 and change_reason为4,change_cash的和
print sum_cash [(result,)]
flask 一次查询两个表
query = db.session.query(TTradeCostDiffBalance, TUserOrder).filter(TTradeCostDiffBalance.order_id == TUserOrder.order_id)
sqlalchemy中我们在 delete、update 的时候加上synchronize_session=False
注意点:我们在删除记录时,默认会尝试删除session中符合条件的对象,in 操作还不支持,解决办法就是删除时不同步,加上(synchronize_session=False )
session.query(User).filter(User.id.in_((1, 2, 3))).delete(synchronize_session=False)
session.commit()
# or session.expire_all()
在當前的工程裏的terninal 輸入 pip freeze > requirements.txt 就會在當前工程裏面生成一個 此項目所需要的各種插件的名陳以及版本號
防止sql注入
db = SQLAlchemy(app) conn = db.session.connection() @app.route('/') def index(): rv = conn.execute('select * from test where id = %s', [1]) return jsonify(rv)
Flask-sqlalchemy总结:
用户的提现申请的统计:
TUserAssetLog.change_reason == x(提现)
TUserAssetsLog.change_frozen_cash(提现金额)
query = db.sesssion.query(func.sum(TUserAssetsLog.change_frozen_cash),
func.count(distinct(TUserAssetLog.uid))).filter(TUserAssetLog.change_reason == x)