【问题标题】:Python MySQLdb select from and insert into another databasePython MySQLdb 选择并插入另一个数据库
【发布时间】:2013-10-08 20:43:58
【问题描述】:

我有一张这样的表:

part    min    max    unitPrice
A       1      9      10
A       10     99     5
B       1      9      11
B       10     99     6
...

我还有一个生产表,我需要将以前的数据插入到这个生产表中。 当我从一个表中执行 select 语句并获取记录时,我很难插入到另一个表中。

cursor_table1.execute('select part, min, max, unitPrice, now() from table1')
for row in cursor_table1.fetchall():
    part, min, max, unitPrice, now = row
    print part, min, max, unitPrice, now

结果是

'416570S39677N1043', 1L, 24L, 48.5, datetime.datetime(2018, 10, 8, 16, 33, 42)

我知道 Python 很聪明地找出了每一列的类型,但我实际上只想要原始内容。所以我可以这样做:

cursor_table1.execute('select part, min, max, unitPrice, now() from table1')
for row in cursor_table1.fetchall():
    cursor_table2.execute('insert into table2 values ' + str(tuple(row)))

问题是如何简单地从一个表中执行选择语句并将其添加到另一个表中。

如果我没有清楚地描述我的问题,请告诉我,如果你愿意,我可以添加额外的信息。

【问题讨论】:

    标签: python mysql sql


    【解决方案1】:

    回答这个问题可能有点晚了,但我也遇到了同样的问题并登陆了这个页面。现在,我碰巧找到了一个不同的答案,并认为与遇到相同问题的其他人分享它可能会有所帮助。

    我有两台 mysql 服务器,一台在 Raspberry Pi 上,另一台在 VPS 上,我必须通过读取 RPi 上的数据并插入 VPS 来在这两个服务器之间同步数据。我已经按照通常的方式编写了一个循环并逐个捕获记录并插入它们,它真的很慢,2000个数据集大约需要2分钟。

    现在我通过使用executemany 函数解决了这个问题。至于数据,我使用fetchall函数获得了select返回的所有元组。

    rows = x.fetchall()
    y.executemany("insert into table2 (f1, f2, f3) values (%s,%s,%s);", rows)
    

    而且速度超级快?,5000 条记录大约需要 2 秒。

    【讨论】:

    • 老兄这对我帮助很大
    • 接近完美,但insert声明不应以分号;结束
    【解决方案2】:

    如果您希望所有数据都通过 Python,您可以执行以下操作:

    import datetime
    
    cursor_table1.execute('SELECT part, min, max, unitPrice, NOW() from table1')
    for row in cursor_table1.fetchall():
        part, min, max, unitPrice, now = row
        cursor_table2.execute("INSERT INTO table2 VALUES (%s,%s,%s,%s,'%s')" % (part, min, max, unitPrice, now.strftime('%Y-%m-%d %H:%M:%S') ))
    

    【讨论】:

      【解决方案3】:

      如果您不需要对从 table1 中选择的数据进行任何计算,而只是将数据插入到另一个表中,那么您可以依赖 mysql 并运行 insert ... select 语句。所以查询代码是这样的:

      cursor_table1.execute('insert into table2 (part, min, max, unitPrice, date) select part, min, max, unitPrice, now() from table1')
      

      编辑: 在知道表在不同的服务器后,我建议使用executemany方法插入数据,因为它会运行得更快。

      首先构建一个包含所有要插入的数据的元组列表,然后运行executemany查询

      【讨论】:

      • 问题是他们不在同一个服务器上。。table1和table2看不到彼此。。
      【解决方案4】:

      如果您的数据多于内存,我希望这里的几个答案会给您带来麻烦。

      也许这不算解决python中的问题,但我这样做:

      from sh import bash
      
      # ... omitted argparse and table listing ...
      
      for table_name in tables_to_sync:
      
          dump = 'mysqldump -h{host} -u{user} -p{password} {db} {table} '.format(
                  host=args.remote_host,
                  user=args.remote_user,
                  password=args.remote_password,
                  db=args.remote_database,
                  table=table_name,
                  )
      
          flags = '--no-create-info --lock-tables=false --set-gtid-purged=OFF '
      
          condition = '--where=\'id > {begin} and id <= {end}\' > {table}.sql '.format(
                  begin=begin,
                  end=end,
                  table=table_name
                  )
      
          bash(['-c', dump + flags + condition])
      
      
          load = 'mysql -u{user} -p{password} {db} < {table}.sql'.format(
                  user=args.local_user,
                  password=args.local_password,
                  db=args.local_database,
                  table=table_name
                  )
      
          bash(['-c', load])
      

      如果您担心性能,您可以考虑完全去掉中间人并使用federated storage engine--但这也是一种非 Python 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多