You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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..

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:57:19