【问题标题】:Parse query result to insert it into another database解析查询结果以将其插入另一个数据库
【发布时间】:2018-11-14 22:04:27
【问题描述】:

从 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')[...];

我正在努力从以前的格式中获取这种格式,有人对如何解决这个问题有任何建议吗?

【问题讨论】:

标签: python mysql sql


【解决方案1】:

使用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 对象,例如 datedatetime、字符串和数字。

根据使用的驱动程序executemany() 可能会或可能不会优化传递多个值元组。例如MySQL ConnectorPyMySQL 优化INSERT 语句。

【讨论】:

  • 这行得通,但我怎样才能骑上 datetime.date、u' 等呢?
  • 当我尝试执行此操作时似乎出现属性错误,我得到的错误消息是 exit
  • 是的,我愿意:try: logging.info(' Trying to execute the query...') cursor = db_connection.cursor() cursor.executemany(query_string, query_data) db_connection.commit() logging.info(' Query executed!') db_connection.close() return logging.info('Connection closed!')
  • 我记录的查询有误,基本上我没有错误,一切看起来都很好,但是数据没有被复制。我的驱动程序是 MySQL,对于连接我使用mysql.connector.Connect
  • 好的,我认为我做错了什么(一如既往)似乎我在同一个数据库上复制相同的数据,而不是将其复制到另一个数据库......
【解决方案2】:

您的结果是元组...只需生成一个合适的 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多