質問

現在、私はORM層でWebフレームワークを評価していると私は興味深い問題でつまずいてきました。私は別のデータベースを使用してJava EE(EJB3 / JPA)アプリケーションでID列を持つテーブルを使用します。 SAPDBで、私はシーケンスを定義し、それに対処するため、JPAシーケンスジェネレータ注釈、私は以前にOracleデータベースにやったのと同じ方法を使用することができます。私は、SQL Server 2005に切り替えるとき、私は突然、SQL Serverが明らかにIDの生成を処理する方法をthatsのためにIDENTITY注釈に全部を交換しなければなりませんでした。私はちょっとJPAは私にそれ以上の抽象化を与えなかったと私は別のデータベースを使用して渡って来る唯一の制限のない推測失望しました。

さて、私の質問に:私は、例えばweb2pyの中ですべてのテーブルがAUTO_INCREMENTインデックスを使用するように変更しなければならないことを読みました。それは同様にシーケンスジェネレータまたはID列をサポートしていますか?どのように他のWebフレームワークはどうですか?彼らは私には、複数のレガシー・データベース間で私のアプリケーションは、ポートできるようになりますか?つまり、テーブル定義は、ID列と文字列のデータ型定義間のわずかな違いを除いて同じです。

(私はそこに文を作成するが、私は必要だった正確に何を覚えてカント変更することを忘れないでください)

IDを取得するに差もあります - コミットする前に、シーケンス・ジェネレータを使用すると、MySQLでAUTO_INCREMENTで、生成されたIDにアクセスすることができ、私の知る限りで、あなたがすることはできません。

役に立ちましたか?

解決

SQLAlchemyのはうまく両方の方法を扱うことができます。このようにスキーマ宣言を考える:

class Foo(Base):
    id = Column(Integer, Sequence('foo_seq', optional=True), primary_key=True)
    ...
それが1つを持っている場合は、

SQLAlchemyのは、それ以外の場合は、シーケンスを定義する、データベースの自動インクリメントのパラダイムに建設され使用されます。また、生成されたIDのフェッチを管理しますが、APIは、最小公倍数があるとして、あなたは明らかに挿入する前にそれにアクセスすることはできません。あなたはofcourseのあなたがしたい場合は、手動でIDを取得することができます。シーケンスを持っていますが、また配列によって裏打ちされています自動インクリメントserialデータ型を持っているPostgreSQL用たとえば、これはserialデータ型を使用します。古いバージョンで、それは自動的にSQLAlchemyの0.6シリーズで、挿入して使用するために次のシーケンス値をプリフェッチし、Postgresはそれを挿入し、一度にフェッチするINSERT ... RETURNING ...機能を使用します8.3+ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top