小编cor*_*ros的帖子

Flask-SQLAlchemy - 会话如何与多个数据库一起使用?

我正在开发一个Flask项目,我正在使用Flask-SQLAlchemy.
我需要使用多个现有的数据库.
我创建了"app"对象和SQLAlchemy对象:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)

在配置中,我设置了默认连接和其他绑定:

SQLALCHEMY_DATABASE_URI = 'postgresql://pg_user:pg_pwd@pg_server/pg_db'
SQLALCHEMY_BINDS = {
    'oracle_bind': 'oracle://oracle_user:oracle_pwd@oracle_server/oracle_schema',
    'mssql_bind': 'mssql+pyodbc://msssql_user:mssql_pwd@mssql_server/mssql_schema?driver=FreeTDS'
}
Run Code Online (Sandbox Code Playgroud)

然后我使用声明性系统创建了表模型,并在需要时设置 __bind_key__参数以指示表所在的数据库.
例如:

class MyTable(db.Model):
    __bind_key__ = 'mssql_bind'
    __tablename__ = 'my_table'

    id = db.Column(db.Integer, nullable=False, primary_key=True)
    val = db.Column(db.String(50), nullable=False)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,一切正常,当我进行查询时,它是在正确的数据库上进行的.

阅读SQLAlchemy文档和Flask-SQLALchemy文档我理解这些事情(我写下来检查我理解正确):

  • 您可以通过会话处理事务.
  • 在SQLAlchemy中,您可以将会话与特定引擎绑定.
  • Flask-SQLAlchemy在请求开始时自动创建会话(scoped_session),并在请求结束时销毁它

所以我可以这样做:

record = MyTable(1, 'some text')
db.session.add(record)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

我无法理解当我们在Flask-SqlAlchemy中使用多个关于会话的数据库时会发生什么.

我验证了系统能够通过__bind_key__参数在正确的数据库中正确绑定表,因此,我可以通过在不同的数据库中插入数据db.session,并在提交时保存所有内容.

但是,我不能理解Flask-SQLAlchemy是否创建多个会话(每个引擎一个会话)或者以不同的方式管理事物.
在这两种情况下,如何引用特定数据库的会话/事务?
如果我使用db.session.commit()系统对所有涉及的数据库进行提交,但是如果我只想为单个数据库提交,我该怎么办?
我会做的事情如下:

db.session('mssql_bind').commit()
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何做到这一点.

我还看到了一个Flask-SQLAlchemy实现,它可以简化这些情况的管理:

问题:https …

python sqlalchemy flask flask-sqlalchemy

9
推荐指数
1
解决办法
6664
查看次数

记录nginx“排队时间”

我不知道“排队时间”是否是我要记录的正确术语,也许 TTFB(到第一个字节的时间)更正确。

我试图通过我所做的测试更好地解释:
我写了一个小 python 应用程序(烧瓶框架),有一个函数(一个端点)需要大约 5 秒才能完成这个过程(但同样的结果,睡眠时间为 5 秒)。
我使用uWSGI作为应用服务器,配置1进程1线程,nginx作为反向代理。
使用此配置,如果我从浏览器执行两个并发请求,我看到第一个在大约 5 秒内完成,第二个在大约 10 秒内完成。
没关系,只有一个 uWSGI 进程,第二个请求必须等待第一个完成,但我想记录的是第二个请求停留在“队列”中等待从 uWSGI 处理的时间。

我尝试了我能找到的所有 nginx 日志变量,并且似乎与我的需要相关:

  • $request_time

    以毫秒为单位的请求处理时间;从客户端读取第一个字节到最后一个字节发送到客户端后写入日志之间经过的时间

  • $upstream_response_time

    保持从上游服务器接收响应所花费的时间;时间以毫秒为单位,以毫秒为单位。

  • $upstream_header_time

    保持从上游服务器接收响应头所花费的时间(1.7.10);时间以毫秒为单位,以毫秒为单位。

但是对于这两个请求,它们都报告了相同的时间,大约 5 秒。
我还尝试添加以记录变量$msec

以秒为单位的时间,在日志写入时以毫秒为单位

和一个自定义变量$my_start_time,在服务器部分的开头初始化,set $my_start_time "${msec}";在此上下文中 msec 是:

当前时间以秒为单位,毫秒分辨率

但在这种情况下,两个请求的两次时间之间的差异约为 5 秒。

我想 nginx 应该知道我尝试记录的时间,或者至少是请求的总时间,我可以从中减去“请求时间”并获得等待时间。

如果我使用 chrome 浏览器分析请求并检查我看到的瀑布,对于第一个请求,总时间约为 5 秒,其中几乎所有时间都在“等待(TTFB)”行中,而对于第二个请求,我看到总共大约 10 秒的时间,其中“Waiting (TTFB)”行中约有 5 个,“Stalled”行中约有 5 个。
我想从服务器端登录的时间是 chrome 报告的“停滞”时间;从这个问题:

了解 Chrome 网络日志“停滞”状态

我知道这次与代理协商有关,所以我认为它与充当反向代理的nginx有关。

为了更容易地测量这些时间,测试配置是用长进程完成的,但是只要并发请求比 uWSGI 进程多,时间就会出现,尽管会更短。

我在阐述中遗漏了什么吗?
这个“排队时间”的正确名称是什么?
我怎样才能记录它?

提前感谢您的任何建议

python performance logging nginx uwsgi

5
推荐指数
1
解决办法
1343
查看次数

Flask SQLAlchemy-仅在当前会话中设置expire_on_commit = False

如何expire_on_commit=False仅在Flask-SQLAlchemy中为当前会话设置选项?

我可以通过以下方式在SQLAlchemy对象的初始化上设置该选项:

db = SQLAlchemy(app, session_options={"expire_on_commit": False})
Run Code Online (Sandbox Code Playgroud)

但是通过这种方式,Flask-SQLAlchemy创建的所有会话都将选项设置为False,而我只想为一个会话设置它。

我尝试过,db.session.expire_on_commit = False但是似乎没有任何效果。

python sqlalchemy flask flask-sqlalchemy

4
推荐指数
1
解决办法
2395
查看次数