Python从MongoDB取列名创建MySQL表报错及修改疑问
问题:从MongoDB获取列名创建MySQL表时的格式错误及类型指定问题
需求与问题描述
需要用Python结合pymongo从MongoDB提取31个列名,以此创建对应的MySQL表。当前代码运行时抛出错误:TypeError: not enough arguments for format string,同时疑惑是否需要为所有列指定数据类型。
用户提供的列名列表:
['STA', 'Date', 'Precip', 'WindGustSpd', 'MaxTemp', 'MinTemp', 'MeanTemp', 'Snowfall', 'PoorWeather', 'YR', 'MO', 'DA', 'PRCP', 'DR', 'SPD', 'MAX', 'MIN', 'MEA', 'SNF', 'SND', 'FT', 'FB', 'FTI', 'ITH', 'PGT', 'TSHDSBRSGF', 'SD3', 'RHX', 'RHN', 'RVG', 'WTE']
用户原代码:
from pymongo import MongoClient import mysql.connector def migrate(): client = MongoClient('mongodb://localhost:27017') db = client['mydb'] coll = db['data'] mongo_docs = coll.find() fieldnames = list(mongo_docs[0].keys()) # 获取数据集所有列名 fieldnames.remove('_id') print(fieldnames) connection = mysql.connector.connect(host="localhost", user="root", database="mydb", password="paswd") cursor1 = connection.cursor() connection.commit() col_namestypes = ['int(3)','date','float(8,5)','int(3)','float(8,5)'] for x in fieldnames: for i in col_namestypes: if i == col_namestypes[0]: cursor1.execute("CREATE TABLE ndata(%s %s)" %(x)%(i)) migrate()
错误原因与解决方案
1. 字符串格式化错误
原代码中"%(x)%(i)"的写法不符合Python字符串格式化规则,正确写法应为"%s %s" % (x, i)。但这不是核心问题——当前循环逻辑会多次尝试创建表,每次仅添加一个字段,完全不符合MySQL创建表的语法要求。
2. 必须为所有列指定数据类型
是的,MySQL要求创建表时每个字段都必须明确指定数据类型。你当前的col_namestypes仅包含5个类型,和31个列名完全不匹配,无法实现字段与类型的一一对应。
3. 代码重构步骤
- 创建列名与数据类型的映射字典,确保每个列都有对应类型;
- 拼接完整的CREATE TABLE语句,一次性创建包含所有字段的表;
- 修正数据库操作逻辑(无需提前commit,创建表后再执行commit)。
修改后的完整代码:
from pymongo import MongoClient import mysql.connector def migrate(): # 连接MongoDB并获取列名 client = MongoClient('mongodb://localhost:27017') db = client['mydb'] coll = db['data'] mongo_docs = coll.find() fieldnames = list(mongo_docs[0].keys()) fieldnames.remove('_id') print(fieldnames) # 定义每个列对应的MySQL数据类型(根据实际业务数据调整) column_types = { 'STA': 'int(3)', 'Date': 'date', 'Precip': 'float(8,5)', 'WindGustSpd': 'int(3)', 'MaxTemp': 'float(8,5)', 'MinTemp': 'float(8,5)', 'MeanTemp': 'float(8,5)', 'Snowfall': 'float(8,5)', 'PoorWeather': 'varchar(255)', 'YR': 'int(4)', 'MO': 'int(2)', 'DA': 'int(2)', 'PRCP': 'float(8,5)', 'DR': 'int(3)', 'SPD': 'int(3)', 'MAX': 'float(8,5)', 'MIN': 'float(8,5)', 'MEA': 'float(8,5)', 'SNF': 'float(8,5)', 'SND': 'float(8,5)', 'FT': 'float(8,5)', 'FB': 'float(8,5)', 'FTI': 'int(5)', 'ITH': 'float(8,5)', 'PGT': 'float(8,5)', 'TSHDSBRSGF': 'varchar(255)', 'SD3': 'float(8,5)', 'RHX': 'int(3)', 'RHN': 'int(3)', 'RVG': 'int(3)', 'WTE': 'int(3)' } # 拼接字段定义字符串 field_definitions = [] for col in fieldnames: # 确保每个列都有对应类型,避免KeyError if col in column_types: field_definitions.append(f"{col} {column_types[col]}") else: # 兜底类型,可根据实际情况调整 field_definitions.append(f"{col} varchar(255)") create_table_sql = f"CREATE TABLE ndata({', '.join(field_definitions)})" # 连接MySQL并执行创建表语句 connection = mysql.connector.connect(host="localhost", user="root", database="mydb", password="paswd") cursor1 = connection.cursor() try: cursor1.execute(create_table_sql) connection.commit() print("表创建成功") except Exception as e: print(f"创建表失败: {e}") connection.rollback() finally: cursor1.close() connection.close() migrate()
关键说明
column_types字典需要根据实际数据内容调整类型,比如文本类字段用varchar,数值类用int或float;- 加入异常处理,避免创建失败时出现数据不一致;
- 一次性拼接所有字段后执行
CREATE TABLE,符合MySQL语法规范。
内容的提问来源于stack exchange,提问作者N..
相关产品推荐
相关产品推荐

