Python连接MySQL:动态判断year列存在性后查询(附代码)
解决MySQL动态查询存在/缺失列的问题
嘿,这个场景我太熟悉了——处理多张结构不完全一致的表时,动态适配列的存在性确实很头疼。咱们可以通过先查询表结构判断列是否存在,再动态生成SQL语句的方式解决,具体步骤如下:
1. 如何判断表中是否存在year列?
MySQL自带的INFORMATION_SCHEMA.COLUMNS表存储了所有数据库的表结构信息,我们可以通过它来查询指定表是否包含year列。查询语句大概是这样:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'bulk' -- 你的数据库名 AND TABLE_NAME = %s -- 要检查的表名 AND COLUMN_NAME = 'year'
如果这个查询返回结果,说明该表有year列;反之则没有。
2. 动态生成查询语句
根据列的存在性,我们可以生成两种SQL:
- 存在
year列时:SELECT text, imdburl, year FROM 表名 - 不存在时:
SELECT text, imdburl, 'N/A' AS year FROM 表名
这样不管表有没有year列,查询结果都会返回三列,后续存CSV时格式也能保持一致。
3. 修改后的完整代码
我把你的代码调整了一下,加上了列检查逻辑,还修复了CSV覆盖的问题(原来的代码每次循环都会覆盖new.csv,现在改成追加模式,只在第一次写入表头):
import pymysql import pandas as pd # 数据库连接 conn = pymysql.connect(host="localhost", user="root", password="", db="bulk") cursor = conn.cursor() # 获取所有表名 cursor.execute("SHOW TABLES") myresult = cursor.fetchall() # 标记是否是第一次写入CSV(控制表头) first_write = True for table in myresult: table_name = table[0] # 取出表名(因为fetchall返回的是元组) print(f"正在处理表: {table_name}") # 检查当前表是否有year列 check_query = """ SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'bulk' AND TABLE_NAME = %s AND COLUMN_NAME = 'year' """ cursor.execute(check_query, (table_name,)) has_year_column = cursor.fetchone() is not None # 动态构建查询语句 if has_year_column: query = f"SELECT text, imdburl, year FROM `{table_name}`" else: query = f"SELECT text, imdburl, 'N/A' AS year FROM `{table_name}`" # 用pandas读取数据 df = pd.read_sql_query(query, conn) # 写入CSV,第一次写表头,后续追加不写表头 df.to_csv("new.csv", index=False, mode='a', header=first_write) first_write = False # 可选:打印当前表的查询结果预览 print(df.head()) # 关闭连接 cursor.close() conn.close()
几个小细节说明:
- 用
f-string拼接SQL时,给表名加上反引号`,避免表名是MySQL关键字时出错 - 使用参数化查询执行列检查(
cursor.execute(check_query, (table_name,))),避免SQL注入风险 - CSV写入用
mode='a'追加模式,header=first_write确保只有第一次写入表头,不会重复
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

