16

SQLAlchemy を使用してテーブルを宣言しようとしています。テーブルに BIGINT 自動インクリメント主キーを含めたいと思います。これは、DB バックエンドとして sqlite では機能しないようです。一方、INTEGER自動インクリメント主キーを持つことは問題なく機能します。

sqlite には署名された bigint である ROWID があることを読みました。しかし、BIGINT 自動インクリメント フィールドを持つ方法はありますか? このようにして、db 固有の問題を気にせずにバックエンドを交換できます (MySQL と Postgres が bigint 自動インクリメント フィールドをサポートしていると仮定します)。

ありがとう。

4

2 に答える 2

25

Google経由でここにアクセスし、解決策が必要な人のために、次のコードを書きました:

# SQLAlchemy does not map BigInt to Int by default on the sqlite dialect.
# It should, but it doesnt.
from sqlalchemy import BigInteger
from sqlalchemy.dialects import postgresql, mysql, sqlite

BigIntegerType = BigInteger()
BigIntegerType = BigIntegerType.with_variant(postgresql.BIGINT(), 'postgresql')
BigIntegerType = BigIntegerType.with_variant(mysql.BIGINT(), 'mysql')
BigIntegerType = BigIntegerType.with_variant(sqlite.INTEGER(), 'sqlite')

これにより、データベースで BIGINT を使用し、単体テストを実行するときに INT を使用できます。

于 2014-04-19T21:01:59.683 に答える
18

BIGINTSqlite では、自動インクリメントで主キーとして使用することはできません。

ただし、sqlite 列型の動的な性質により、バックエンド固有の列型を作成し、バックエンドのINTEGER場合は型を使用できます。 SQLAlchemy: バックエンドに応じて列の型を条件付きで選択する方法 をsqlite参照してください。

それが役立つことを願っています。

于 2013-09-16T19:39:38.747 に答える