【发布时间】:2013-08-16 20:53:12
【问题描述】:
我将使用pymysql、tempfile 和subprocess 编写一个脚本,将我的 MySQL 数据库传输到 MongoDB,但到目前为止我还没有做好。
在以下代码中:
for table_name in table_list:
cur.execute("select * from {0};".format(table_name))
with tempfile.TemporaryFile(mode='w+') as fp:
writer = csv.writer(fp)
writer.writerow([i[0] for i in cur.description])
for record in cur.fetchall():
writer.writerow(record)
fp.seek(0)
subprocess.Popen(['mongoimport', '-d', db_mongo, '-c', table_name, '--type', 'csv', '--file', *** I don't know what should be specified here ***, '--headerline'])
我尝试迭代任何mysql数据库的表名,从表中选择所有数据,将结果写入临时文件,然后使用mongoimport将文件中的数据倒入mongodb数据库。但是,一,我不知道如何在subprocess.Popen 函数中指出文件名。二、有没有更好的方法来做我想做的事?我认为有,但在我的脑海中想不出比这更好的一个......
为了您的信息,我最初使用实际(不是临时)文件名,但如果表太大,它会失败,因为它会在完成前一个表的 subprocess.Popen 操作之前尝试创建从另一个表派生的另一个文件(去进入下一次迭代,我的意思是),它还迫使我在整个过程完成后删除文件,所以我更喜欢使用临时文件而不是实际文件,但不完全确定我是否正确......
谢谢。
【问题讨论】:
-
附带说明,
fp.seek(0)在这里没有任何用处;您没有将文件作为文件描述符传递给mongoimport,因此文件描述符中的位置指针无关紧要。
标签: python mongodb subprocess temporary-files