MySQL 5.7无CTE支持下BigQuery迁移数据查询导入DataFrame问题
问题描述
将部分数据库从BigQuery迁移到不支持CTE(WITH子句)的MySQL 5.7,需要将涉及时区处理、跨表关联的查询结果读取到DataFrame中,现有代码执行存在多处报错。
问题原因拆解
- 执行
CREATE VIEW语句报错「表a已存在」:多次执行同名视图创建语句未做存在判断,且该SQL本身语法错误,CREATE VIEW后必须跟完整SELECT语句,不能直接拼接LEFT JOIN逻辑 - 执行第二个查询报错「unknown column name a.date」:字段归属关联错误,别名a是kpi表的子查询,date字段是pm_tv表(别名b)计算生成的,a表本身没有date字段
- pandas.read_sql无法支持多语句:不需要使用多语句执行,编写单条合法的单查询语句即可直接读取结果,无需创建临时视图
可行解决方案
步骤1:修正SQL查询逻辑
MySQL 5.7虽然不支持CTE,但完全支持JOIN后的子查询和字段计算逻辑,不需要创建视图即可完成关联:
SELECT b.*, a.*, STR_TO_DATE(b.FECHA_HORA_REAL, '%d/%m/%Y %H:%i') AS date FROM pm_tv b LEFT JOIN kpi a ON a.FECHA_HORA_MINUTO = STR_TO_DATE(b.FECHA_HORA_REAL, '%d/%m/%Y %H:%i')
如果需要复用计算逻辑,也可以将视图创建语句替换为防重复创建的写法:
CREATE OR REPLACE VIEW pm_tv_with_date AS SELECT *, STR_TO_DATE(FECHA_HORA_REAL, '%d/%m/%Y %H:%i') AS date FROM pm_tv;
步骤2:直接用pandas读取结果
不需要使用cursor执行多语句,直接把修正后的单条查询语句传入read_sql即可:
import mysql.connector import pandas as pd cnx = mysql.connector.connect( user='guest', password='pwd', host='ip', database='db' ) # 传入修正后的单条查询语句 query = """ SELECT b.*, a.*, STR_TO_DATE(b.FECHA_HORA_REAL, '%d/%m/%Y %H:%i') AS date FROM pm_tv b LEFT JOIN kpi a ON a.FECHA_HORA_MINUTO = STR_TO_DATE(b.FECHA_HORA_REAL, '%d/%m/%Y %H:%i') """ df = pd.read_sql(query, cnx) print(df.head()) cnx.close()
补充说明
原日期格式化符%d/%m/%Y %H:%存在语法错误,补全为%d/%m/%Y %H:%i匹配分钟级时间格式,避免日期转换失败返回NULL。
内容的提问来源于stack exchange,提问作者Aaron G.
相关产品推荐
相关产品推荐

