我的表格如下:
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语句并将其添加到另一个表中。
如果我没有以清晰的方式描述我的问题,请告诉我,如果您愿意,我可以添加额外的信息。
答案 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方法。