Python MySQLdb选择并插入另一个数据库

时间:2013-10-08 20:43:58

标签: python mysql sql

我的表格如下:

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

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

如果我没有以清晰的方式描述我的问题,请告诉我,如果您愿意,我可以添加额外的信息。

4 个答案:

答案 0 :(得分: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') ))

答案 1 :(得分:2)

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

我有两个mysql服务器,一个在Raspberry Pi上,另一个在VPS上,我不得不通过读取RPi上的数据并插入VPS来同步这两个数据。我通过编写一个循环并逐个捕获记录并插入它们来完成常规方法,它非常慢,2000个数据集花了大约2分钟。

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

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

它超级快,5000条记录花了大约2秒钟。

答案 2 :(得分:1)

如果您不需要使用从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查询

答案 3 :(得分:0)

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

也许这不算解决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方法。

相关问题