python - 使用 Python 和 pandas 无法正确填充 MySQL 计数器列

标签 python mysql pandas

我有一个使用变量来生成计数器的 MySQL 查询:

select
  zz.work_order,
  zz.op_number,
  @num := if(@wo = zz.work_order, @num+1,1) as 'steps_away',
  @wo := zz.work_order as 'dummyWO'
from
  (
   select
     w.work_order,
     w.op_number
   from
     [sql cut]
   order by
     w.work_order asc,
     r.op_number asc
) as zz

当我在 MySQL 工作台中执行此操作时,steps_away 已正确填充。 第一次出现工作订单时,steps_away = 1,下一次出现时,steps_away = 2,依此类推,直到看到新的工作订单并且计数器重置。

在 Python 中,我使用 pandas read_sql 和 to_sql 函数将查询保存在 DataFrame 中,然后将其发送到数据库。

df = pd.read_sql(sql_cmd, engine)

无论我使用 df.to_csv 将此 df 发送到 csv 还是使用 df.to_sql 发送到表,steps_away 列的值始终为 1。

什么可能导致查询在直接在 MySQL 中运行时与在 Python 中调用时看起来正确?

更新

我对此进行了更多测试,发现了一些奇怪的事情。当我再次在 MySQL Workbench 中尝试查询时,steps_away 中的值全部(错误地)等于 1。我立即重新运行查询,没有任何更改,然后值被正确填充。

我在 Python 中添加了两次 pd.read_sql 行,以匹配我手动执行的操作,并且 DataFrame 现在具有 steps_away 的正确值。在查询中使用此计数器会导致这种行为,有时有效,有时无效,并且似乎调用查询两次可以确保计数器列正确填充,这是怎么回事?

最佳答案

看起来这都是与 MySQL 相关的,与 python 无关。 需要首先将变量设置为值来初始化变量。在 from 部分的另一个子查询中执行此操作,问题得到解决。

select
  zz.work_order,
  zz.op_number,
  @num := if(@wo = zz.work_order, @num+1,1) as 'steps_away',
  @wo := zz.work_order as 'dummyWO'
from
  (
   select
     w.work_order,
     w.op_number
   from
     [sql cut]
   order by
     w.work_order asc,
     r.op_number asc
  ) as zz,
  (
   select
     @num:=0,
     @wo:=''
  ) as r

关于python - 使用 Python 和 pandas 无法正确填充 MySQL 计数器列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39838143/

相关文章:

python - 当其中有 HTML 转义字符串时,使用 python (pandas) 读取 CSV 文件

python - Kubernetes Python驱逐API提示 'Name parameter required.'

mysql - 备份mysql集群数据库的最佳方法

python - 从嵌套字典创建 dfs 并计算字符串以创建带有子图的图

python - 通过索引中的部分字符串匹配选择行

python - 循环转置和连接数据帧列表

python - OSX Python系统框架意外覆盖

mysql - MS-SQL SERVER 中的 Group_concat MySQL 函数等效项

java - 结果集返回空值

python - 在 CSV 中每列查找 'strongest' 类型