2

我有一张桌子,看起来像这样:

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

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

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

4

4 回答 4

8

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

我有两台 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 秒。

于 2018-05-09T15:00:20.380 回答
3

如果您希望所有数据都通过 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') ))
于 2013-10-08T22:03:30.927 回答
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查询

于 2013-10-08T21:01:56.340 回答
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])

如果您担心性能,您可能会考虑完全去掉中间人并使用联合存储引擎——但这也是一种非 Python 方法。

于 2018-07-03T23:17:54.240 回答