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

問題は、あるテーブルから select ステートメントを実行し、それを別のテーブルに追加する方法です。

質問を明確に説明していない場合はお知らせください。必要に応じて追加情報を追加できます。

4

4 に答える 4

8

この質問に答えるのは少し遅いかもしれませんが、私も同じ問題を抱えていて、このページにたどり着きました. 今、たまたま別の答えを見つけて、同じ問題を抱えている他の人と共有することが役立つかもしれないと考えました.

2 つの mysql サーバーがあり、1 つは Raspberry Pi に、もう 1 つは VPS にあり、RPi でデータを読み取って VPS に挿入することで、これら 2 つの間でデータを同期する必要がありました。ループを作成し、レコードを 1 つずつキャッチして挿入するという通常の方法で実行しましたが、非常に遅く、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 に答える