2012-03-04 3 views
0

SQLAlchamyには、ドキュメントやチュートリアルから理解できないことがあります。SQLAlchamyデータベースの構築と再利用

私はDBテーブルからクラスを自動ロードする方法を見ています。クラスを設計し、それを(宣言的にまたはmapper()を使用して)DBに追加されたテーブルから作成する方法を見ています。

私の質問はどのようにしてテーブルを作成し、最初に実行したときにコードを書き込んでから、それを再利用するのですか

私は1つのツールまたは1つのコードでデータベースを作成し、データベースを使用するために別のコードを作成する必要はありません。事前に

おかげで、 ピーター

答えて

1

create_all()テーブルがすでに存在する場合は何もしないので、エンジンまたは接続を設定するとすぐに呼び出してください。

(あなたがあなたのテーブルのスキーマを変更場合、create_all()がそれを更新しませんので、あなたはまだそれを行うには、「別のプログラムを」必要があることに注意してください!。)

これはいつものパターンです:

def createEngine(metadata, dsn, **args): 
    engine = create_engine(dsn, **args) 
    metadata.create_all(engine) 
    return engine 

def doStuff(engine): 
    res = engine.execute('select * from mytable') 
    # etc etc 

def main(): 
    engine = createEngine(metadata, 'sqlite:///:memory:') 
    doStuff(engine) 

if __name__=='__main__': 
    main() 
+0

ありがとうございます - 私は存在しない問題の解決策を探していたと思います。クラスを明示的に自動読み込みまたは定義するベストプラクティスの解決策は何ですか?前者はDBとオブジェクトが一致するように見えますが、後者は '魔法'ではなくコード内のオブジェクトを指定します。 – user1247965

+1

アプリケーションがデータベースを「所有している」(つまり、そのアプリケーション用に作成された)アプリケーションの場合は、コード内でテーブル構造を明示的にします。アプリケーションが単に既存のデータベースを使用している場合は、すべて自動ロードします。どちらの場合でも、テーブル構造がアプリケーションの期待値と一致するという保証はありません。スキーマが想定されているものと十分に異なる場合は、どちらのシナリオでもアプリケーションが中断する可能性があります。 –

0

私はあなたが過剰思考の状況を、おそらくだと思います。データベースを新しく作成したい場合は、普通はBase.metadata.create_all()または同等のものを呼び出してください。そうしたくない場合は、呼び出さないでください。

データベースが既に設定されていると仮定して、毎回それを呼び出して、間違った場合に例外を処理してみることができます。

また、特定のテーブルのクエリを実行しても問題が解決しない場合は、create_all()を呼び出してすべてを配置してください。

db作成を実行するかどうかにかかわらず、アプリの他の部分はすべて同じ方法で動作するはずです。

+0

おかげさまで、それは意味があります...まず問題を修正する必要はありません! – user1247965

関連する問題