0

現在、ORMレイヤーを使用してWebフレームワークを評価していますが、興味深い問題に遭遇しました。異なるデータベースを持つJavaEE(EJB3 / JPA)アプリケーションでID列を持つテーブルを使用しました。SAPDBでは、以前にOracleデータベースで行ったのと同じ方法で、シーケンスを定義し、jpaシーケンスジェネレータアノテーションを使用してそれを処理できました。SQL Server 2005に切り替えたとき、SQL ServerがID生成を処理する方法であるため、突然すべてをIDENTITYアノテーションに置き換える必要がありました。JPAがそれ以上の抽象化を提供しなかったことに少しがっかりしました。さまざまなデータベースを使用して遭遇する制限は、それだけではないと思います。

さて、私の質問です。たとえば、web2pyでは、auto_incrementインデックスを使用するようにすべてのテーブルを変更する必要があることを読みました。シーケンスジェネレーターまたはID列もサポートしていますか?他のWebフレームワークはどうですか?アプリケーションを複数のレガシーデータベースに移植できますか?つまり、テーブルの定義は、ID列と、文字列のデータ型定義のわずかな違いを除いて同じです(そこで、createステートメントを変更したことは覚えていますが、正確に何が必要だったかは思い出せません)。

IDの取得にも違いがあります。シーケンスジェネレーターでは、コミット前に生成されたIDにアクセスできますが、MySQLのauto_incrementではアクセスできません。

4

1 に答える 1

1

SQLAlchemy は両方の方法を問題なく処理できます。次のようなスキーマ宣言があるとします。

class Foo(Base):
    id = Column(Integer, Sequence('foo_seq', optional=True), primary_key=True)
    ...

SQLAlchemy は、データベースに組み込みの自動インクリメント パラダイムがある場合はそれを使用し、そうでない場合はシーケンスを定義します。生成された ID のフェッチも管理しますが、API は最小公分母であるため、挿入前にアクセスすることはできません。もちろん、必要に応じて ID を手動で取得することもできます。たとえば、シーケンスを持ち、シーケンスに基づく自動インクリメントserialデータ型も持つ PostgreSQL の場合、これはそのserialデータ型を使用します。古いバージョンでは、挿入で使用する次のシーケンス値を自動的にプリフェッチします。SQLAlchemy 0.6 シリーズおよび Postgres 8.3+ では、このINSERT ... RETURNING ...機能を使用して挿入とフェッチを一度に行います。

于 2009-10-01T17:55:29.433 に答える