0

私はPythonが初めてで、Pythonを基本的なORMとしてStormを使い始めました。

ファイルに大量のデータがあり、いくつかの重複があります。それらを識別するために、いくつかの行の ID が重複していることがわかります。

それらをデータベースに挿入したいのですが、idを主キーに設定したので、重複することはありません。重複している場合、コードでテーブルへのデータの挿入を無視したい。しかし、代わりに失敗するだけです_mysql_exceptions.IntegrityError: (1062, "Duplicate entry '75083587476530022' for key 'PRIMARY'")

これは私のクラスの定義です

from storm.locals import *

class Board(object):
  __storm_table__ = 'boards'
  id = Int(primary=True)
  description = Unicode()
  category = Unicode()

  def __init__(self, val): 
    self.id = val['id']
    self.description = val['description']
    self.category = val['category']

行を作成するには、次のようにします。

database = create_database('mysql://root@/mydb') 
store = Store(database)
data = {u'description': u'', u'id': 165366686256470180, u'category': u'Children'}
store.add(Board(data))
store.commit()
store.flush()

また、MYSQLでできることを知っています

ON DUPLICATE KEY UPDATE o

Storm にこれを使用させる方法はありますか?

4

2 に答える 2

2

SQL 挿入の前に重複を削除する Python スクリプトを作成します。それ以外の場合は、各行をコミットし、例外をキャッチして行を無視する必要があります。これは良くありません。クリーンなデータを用意して、すべてを一度にコミットする方がはるかに優れています。SQL は実際には、データの整合性ではなく、テーブル操作のみに関係しています。

于 2012-10-23T18:25:39.403 に答える
0

DBにそれを処理させたい場合は、次のことをお勧めします。

from MySQLdb import IntegrityError
# You connected to DB and have your store
# You loaded your data inside data_list
for data_row in data_list:
    try:
        store.add(Board(data_row))
        store.flush() # This is enough to raise any DB error
    except IntegrityError:
        continue # You can probably log something here
store.commit()
于 2015-11-30T17:51:53.477 に答える