0

XMLファイルの山からいくつかのデータを引き出したいです。動作しているパーサー/エクストラクターがありますが、DBにうまく配置できませんでした。

私はすべてのデータを保持するために非常にフラットな単純なテーブルを試していましたが、要素を元に戻すには複雑すぎました。

私がやろうとしていることを振り返って、私は法案に合うように見えるMySQLデータモデルを構築しました。これはいくつかのテーブルで構成されているため、次のタスクは、抽出されたデータを適切なテーブルに配置するメソッドを構築することです(重複値などをチェックした後)

データの塊ごとにジェネリッククラスを作成することを計画しました。これは、提示したデータオブジェクトを取得し、適切なテーブルに移動して、既に存在するかどうかを確認します。存在しない場合は、テーブルにも追加する必要があります。 2番目のテーブルのキー値。存在する場合は、単純にキー値をプルバックし、それを2番目のテーブルに書き込む必要があります。

これを疑似表記で説明する方法がわかりませんが、これは賢明なアプローチのように思われますか?別の方法は、すべてのデータの塊に対して特定のコネクタ/チェッカー/アップデータを書き込むことのようです(そして、塊とは、1つのテーブルに適切なホームを持つ特定のラベル付きデータの1つまたはn個を意味します)。

4

1 に答える 1

1

それでORMを使用しますか?そうでない場合、これは良い考えです。

一般的なアプローチは問題ありませんが、いくつかのジェネリック クラスを使用して実装してみてください。すなわち。実装は次のようになります。

class NodeSaver(object):
    def __init__(self, node):
        self.node = node

    def save(self, connection=default_connection):
        object = self.get_or_insert_to_first_table()
        self.insert_to_second_table(object)

    def get_or_insert_to_first_table(self):
        search_values = self.get_search_values()
        main_table = self.get_main_table()
        objects = main_table.objects.filter(**search_values) # notation from Django ORM
        if objects.exists():
            return objects[0]
        else:
            insert_values = {}
            insert_values.update(search_valuse)
            insert_values.update(self.get_insert_values())
            return main_table.objects.create(**insert_values)

    def get_or_insert_to_second_table(self):
        ...

    def get_main_table(self):
        return self.main_table

    def get_second_table(self):
        return self.second_table

class MyDataLumpSaver(NodeSaver):
    main_table = models.MyData
    second_table = models.OtherData

    def get_search_values(self):
        #

    def get_insert_values(self):
        #

このようなクラスを持つことで、いくつかのメソッドをオーバーライドすることで、データの塊のためにクラスを拡張できます。アイデアが気に入ったら、Django Class Based Views を見てください。それらはそのアプローチで書かれています。

于 2012-04-18T06:04:25.757 に答える