0

私は、電子部品データを含む SQL データベースへの Python インターフェイスに取り組んでいます。すべてのパーツ タイプ クラスが継承するマスター パーツ番号参照テーブルを表す基本クラスがあります。各サブクラスには、パラメトリック データを保持するための独自のテーブルがあります。Part の各インスタンスが 1 つ以上のインスタンスを持つ、ベンダー データなどの情報を含む他のクラスもいくつかあります。継承階層は次のようになります。

Part
    PartTypeA
    PartTypeB

Part クラスには、ベンダー情報などを説明する他のテーブルとの関係がいくつかあります。

データベースへのパーツの追加を処理する別の DatabaseManager クラスがあります (SQLAlchemy エンジンのインスタンスを管理および制御します)。テーブルが他のクラスで定義されている場合でも、SQLAlchemy を使用してすべてのテーブルに対して CREATE ステートメントを発行するにはどうすればよいですか?

私は次のことを試しました(これはデータベースマネージャークラスにあります):

self.db_engine = create_engine(db_uri, echo=False)
Part.metadata.create_all(self.db_engine)

これは実際に機能しますが、その理由はわかりません (おそらく、Part にはいくつかのテーブルへの SQLAlchemy Relationships が含まれており、他のテーブルはすべて Part のサブクラスであるためでしょうか?)。SQLAlchemy ドキュメントの例は、エンジンがデータベース テーブルと同じ場所で定義されていることを前提としているようです。

これが正しい方法かどうか誰にもわかりませんか?そうでない場合、SQLAlchemy に CREATE ステートメントを発行させる適切な方法は何ですか?

4

2 に答える 2

0

これが正しい方法です。
キーはmetadata.create_all(db_engine)、基本的にインスタンスで定義されているすべてのデータ オブジェクトを作成しmetadataます。したがって、使用法は正しいです。他のすべてのマップされたオブジェクトがマップされるインスタンスPart.metadataを取得する方法にすぎません。metadataただし、クラスはインスタンスDatabaseManagerへの直接参照を持つ可能性があります。MetaData

于 2012-06-04T12:02:55.327 に答える
0

このコードをMySQLに移植してみましたが、sqliteを使っていたときのようにcreate文が発行されませんでした。コードをMySQLで動作させるために私がしたことは次のとおりです。

# Create an instance of each class and bind it's metadtata
items = []
for cls in self.get_class_list():
    temp = cls()
    temp.__table__.metadata = metadata
    items.append(temp)

# Issue CREATE statements
for item in items:
try:
    item.__table__.create()
        except Exception as e:
            print e
于 2012-09-12T17:09:20.823 に答える