代码之家  ›  专栏  ›  技术社区  ›  roberto.sannazzaro

分析查询结果以将其插入另一个数据库

  •  0
  • roberto.sannazzaro  · 技术社区  · 7 年前

    从mysql数据库运行查询后,我得到以下结果:

    (datetime.date(2000, 11, 11), u'superuser', datetime.date(2000, 11,11),u'yes')
    (datetime.date(2001, 11, 11), u'superuser', datetime.date(2001, 11,11),u'yes')
    (datetime.date(2002, 11, 11), u'superuser', datetime.date(2002, 11,11),u'yes')
    (datetime.date(2003, 11, 11), u'superuser', datetime.date(2003, 11,11),u'yes')
    

    这些结果来自一个包含四列的数据库:

    last_login | is_superuser | data_joined | is_active
    

    我的问题是,我需要将这些数据插入到另一个具有相同结构的数据库中,但我需要以mysql能够接受查询的方式解析数据:

     INSERT INTO  auth_user.auth_user (last_login, is_superuser, data_joined, 
     is_active) VALUES 
        ('2008-11-11', 'superuser', '2008-11-11', 'yes'),
        ('2008-11-11', 'superuser', '2008-11-11', 'yes'),
        ('2008-11-11', 'superuser', '2008-11-11', 'yes'),
        ('2008-11-11', 'superuser', '2008-11-11', 'yes')[...];
    

    我正在努力从上一个版本中获得这个格式,有人建议如何解决这个问题吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ilja Everilä    7 年前

    使用 executemany() 以及参数化查询。假设上一个查询的结果存储为名为 results :

    query = """INSERT INTO  auth_user.auth_user
               (last_login, is_superuser, data_joined, is_active)
               VALUES (%s, %s, %s, %s)"""
    
    # If your driver's cursors don't work as context managers, wrap with
    # contextlib.closing
    with conn.cursor() as cursor:
        cursor.executemany(query, results)
    
    conn.commit()
    

    您的驱动程序知道如何传递常用的python对象,例如 date , datetime ,字符串和数字(当使用参数化查询时)。

    取决于使用中的驾驶员 执行管理() 可以优化传递多个值元组,也可以不优化传递多个值元组。例如 MySQL Connector PyMySQL 优化插入语句。

        2
  •  1
  •   Attie    7 年前

    你的结果是元组…只需生成一个合适的sql查询,然后 execute() 它:

    query = 'INSERT INTO auth_user.auth_user'                       \
              ' (last_login, is_superuser, data_joined, is_active)' \
              ' VALUES (%s, %s, %s, %s);'
    
    for result in results:
        cursor.execute(query, result)