heraldww 2024-07-18 23:20 采纳率: 29.2%
浏览 7

python插入mysql记录,只能插入一个字段

python插入mysql记录,只能插入一个字段,百思不得其解,这是为啥


        cursor = self.conn.cursor(pymysql.cursors.DictCursor)         
        # 1. 执行SQL,返回受影响的行数  
        effect_row1 = cursor.execute("select * from gnss_log2")         
        # 2. 执行SQL,返回受影响的行数,一次插入多行数据
        for i in range(2):
            cmd,para=self.make_random_test2_data()
            print(cmd)
            print(para)
            er2 = cursor.executemany(cmd,para)  #运行到这里会出错
        # 查询所有数据,返回数据为元组格式  
        result = cursor.fetchall()        
        # 增/删/改均需要进行commit提交,进行保存  
        self.conn.commit() 
        # 关闭游标  
        cursor.close()        

其中make_random_test2_data函数是这样的
请注意这两行
#b="INSERT INTO gnss_log2 (datetime,EW,JinDu,NS, WeiDu) VALUES (%s,%s,%s,%s,%s)"
#su=[now,rr1,ee1,rr2,ee2] #打开注释的这两行,且屏蔽以下2行,程序就可以运行,但是只能插入一个字段

def make_random_test2_data(self):
        r1 = random.randint(0, 1)
        r2 = random.randint(0, 1)
        if(r1==0):
            rr1="e"
        else:
            rr1="w"
        if(r2==0):
            rr2="n"
        else:
            rr2="s"
        arr=[]
        ee1=random.uniform(0, 360)
        ee2=random.uniform(0,90)
        now = datetime.now()# 获取当前时间
        #b="INSERT INTO gnss_log2 (datetime,EW,JinDu,NS, WeiDu) VALUES (%s,%s,%s,%s,%s)"
        #su=[now,rr1,ee1,rr2,ee2]  #打开注释的这两行,且屏蔽以下2行,程序就可以运行,但是只能插入一个字段
        b="INSERT INTO gnss_log2 (JinDu,WeiDu) VALUES ( %s,%s  )"
        su=[ee1,ee2]  #出错,见下面提示
        return b,su

出错提示如下:

 File "d:\_work\_sync_work6\python\test_proj001\mysql_hal.py", line 36, in init
    er2 = cursor.executemany(cmd,para)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\easy_\AppData\Roaming\Python\Python312\site-packages\pymysql\cursors.py", line 182, in executemany
    return self._do_execute_many(
           ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\easy_\AppData\Roaming\Python\Python312\site-packages\pymysql\cursors.py", line 205, in _do_execute_many
    v = values % escape(next(args), conn)
        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
TypeError: not enough arguments for format string

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-18 23:20
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    你的代码中存在一些问题,导致你无法插入多个字段,并且出现了TypeError。以下是一些建议和解决方案:

    1. 修改make_random_test2_data函数

    你需要确保生成的SQL语句包含所有需要插入的字段,并且传递给executemany的参数列表与SQL语句中的占位符数量匹配。

    import random
    import datetime
    
    def make_random_test2_data(self):
        r1 = random.randint(0, 1)
        r2 = random.randint(0, 1)
        if r1 == 0:
            rr1 = "e"
        else:
            rr1 = "w"
        if r2 == 0:
            rr2 = "n"
        else:
            rr2 = "s"
        ee1 = random.uniform(0, 360)
        ee2 = random.uniform(0, 90)
        now = datetime.datetime.now()  # 获取当前时间
        b = "INSERT INTO gnss_log2 (datetime, EW, JinDu, NS, WeiDu) VALUES (%s, %s, %s, %s, %s)"
        su = [now, rr1, ee1, rr2, ee2]
        return b, su
    

    2. 使用executemany时确保参数正确

    在调用executemany时,你需要确保传递的参数是一个参数列表的列表,即每个元素都是一个参数列表。

    import pymysql
    
    class DatabaseHandler:
        def __init__(self, host, user, password, db):
            self.conn = pymysql.connect(host=host, user=user, password=password, db=db, charset='utf8mb4')
        
        def make_random_test2_data(self):
            r1 = random.randint(0, 1)
            r2 = random.randint(0, 1)
            if r1 == 0:
                rr1 = "e"
            else:
                rr1 = "w"
            if r2 == 0:
                rr2 = "n"
            else:
                rr2 = "s"
            ee1 = random.uniform(0, 360)
            ee2 = random.uniform(0, 90)
            now = datetime.datetime.now()  # 获取当前时间
            b = "INSERT INTO gnss_log2 (datetime, EW, JinDu, NS, WeiDu) VALUES (%s, %s, %s, %s, %s)"
            su = [now, rr1, ee1, rr2, ee2]
            return b, su
        
        def insert_data(self):
            cursor = self.conn.cursor(pymysql.cursors.DictCursor)
            cmd, para = self.make_random_test2_data()
            print(cmd)
            print(para)
            er2 = cursor.executemany(cmd, [para])  # 注意这里传递的是一个列表的列表
            self.conn.commit()
            cursor.close()
    
    # 使用示例
    db_handler = DatabaseHandler('localhost', 'root', 'password', 'your_database')
    db_handler.insert_data()
    

    3. 注意点

    • 确保数据库连接参数(如主机名、用户名、密码、数据库名)正确。
    • 在调用executemany时,传递的参数需要是一个列表的列表,每个内部列表对应一条记录的参数。

    通过这些修改,你应该能够解决插入多字段和TypeError的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月18日