【问题标题】:User-defined variables support in SqlalchemySqlalchemy 中的用户定义变量支持
【发布时间】:2021-12-16 16:24:52
【问题描述】:

SQLAlchemy 是否支持用户定义的变量?

https://dev.mysql.com/doc/refman/5.6/en/user-variables.html

问题:我正在尝试获取两个连续行之间的时间差。我可以通过使用用户定义的变量编写原始 SQL 查询来做到这一点。这是否可以在 SQLAlchemy 中完成而无需编写原始 SQL 查询?

我的桌子是这样的:

id user_id date
1. user_1  01-11-2021 00:00
2. user_1  01-11-2021 00:00
3. user_1  01-11-2021 00:01
4. user_2  01-11-2021 00:00

输出类似于

id user_id time_diff
1. user_1  NULL
2. user_1  0
3. user_1  1
4. user_2  NULL

【问题讨论】:

  • SQLAlchemy 是否支持用户定义的变量? 外部脚本无法访问用户定义的 MySQL 变量。但是您可以在原始 SQL 查询中使用它们。 这是否可以在 SQLAlchemy 中完成而不编写原始 SQL 查询? 是的,您可以构建一个使用 3 个源表副本的查询。
  • @Akina 外部脚本无法访问用户定义的 MySQL 变量。 为什么会这样?你能解释一下或链接到解释这一点的页面吗?
  • 如果外部脚本想知道 UDV 的值,它必须查询它(如SELECT @variable')并接收该值。没有别的办法。除了查询它之外,无法访问该变量。

标签: python mysql sqlalchemy user-variables


【解决方案1】:

执行所需任务且不使用 UDV 且适用于 MySQL 5.6 的 SQL 查询如下所示:

SELECT t1.*, TIMESTAMPDIFF(SECOND, t1.date, t2.date) time_diff
FROM table t1
LEFT JOIN table t2 ON t1.user_id = t2.user_id 
                  AND t1.date > t2.date
LEFT JOIN table t3 ON t1.user_id = t3.user_id 
                  AND t1.date > t3.date
                  AND t3.date > t2.date
WHERE t3.id IS NULL

逻辑:我们从表副本t1t2中为用户选择2行(date值)(t2中的行具有更早的date值),副本@987654327 @ 检查这些行是否真的相邻(它们之间没有第三行)。

此查询不使用 UDV,可以转换为 SQLAlchemy 语法。

【讨论】:

  • 我想将其用作子查询并获取所有用户花费的总时间。我试图避免原始 SQL 查询以减轻相关风险。但如果以时间为代价,我愿意承担额外的风险。我的问题是,与 UDV 相比,使用 LEFT JOIN 会增加/减少运行查询所需的时间吗?还是使用 UDV 并在正确验证后替换输入更好?
  • @LemonReddy 我正在尝试避免使用原始 SQL 查询来降低相关风险。 我理解这一点。我的查询可以从原始文本转换为框架的语法,并且您不会使用原始查询。 与 UDV 相比,使用 LEFT JOIN 会增加/减少运行查询所需的时间吗? 使用 UDV 的查询无论如何都更便宜 - 它使用一个表副本和单遍全扫描,这必须更多即使存在合适的索引,也比连接 3 个表副本快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2019-09-30
相关资源
最近更新 更多