web-dev-qa-db-ja.com

SQLAlchemy自動インクリメント開始値の設定

SQLAlchemyのautoincrement引数はTrueFalseのみのようですが、事前定義された値aid = 1001、自動インクリメントaid = 1002次の挿入が行われたとき。

SQLでは、次のように変更できます。

ALTER TABLE article AUTO_INCREMENT = 1001;

私はMySQLを使用していますが、以下を試してみましたが、うまくいきません:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Article(Base):
    __tablename__ = 'article'
    aid = Column(INTEGER(unsigned=True, zerofill=True), 
                autoincrement=1001, primary_key=True)

それで、どうすればそれを取得できますか?前もって感謝します!

25
Gorthon

DDLEvents を使用してこれを実現できます。これにより、CREATE TABLEの実行直後に追加のSQLステートメントを実行できます。リンクの例を見てくださいが、あなたのコードは以下のようになると思います:

from sqlalchemy import event
from sqlalchemy import DDL
event.listen(
    Article.__table__,
    "after_create",
    DDL("ALTER TABLE %(table)s AUTO_INCREMENT = 1001;")
)
23
van

ドキュメント によると:

自動インクリメント–このフラグをFalseに設定すると、「自動インクリメント」列と見なしてはならない整数主キー列を示します。これは、INSERT時に暗黙的に値を生成し、通常はを介して値が返される整数主キー列です。 DBAPI cursor.lastrowid属性。デフォルトはTrueで、単一の整数の主キー列を持つテーブルの一般的な使用例を満たします。

したがって、autoincrementは、インクリメントする主キーかどうかをSQLAlchemyに知らせるためのフラグにすぎません。

あなたがやろうとしていることは、カスタムの自動インクリメントsequenceを作成することです。

したがって、あなたの例、Ithinkは次のようになります。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import Sequence

Base = declarative_base()

class Article(Base):
    __tablename__ = 'article'
    aid = Column(INTEGER(unsigned=True, zerofill=True), 
                 Sequence('article_aid_seq', start=1001, increment=1),   
                 primary_key=True)

注:PostgreSQLを使用しているかどうかはわからないので、次の場合は following に注意してください。

Sequenceオブジェクトは、PostgresqlのSERIALデータ型に対応する特別な機能も実装します。 PGのSERIAL型は、挿入中に暗黙的に使用されるシーケンスを自動的に生成します。これは、TableオブジェクトがOracleおよびFirebirdで動作するように主キー列にシーケンスを定義する場合、そのシーケンスがPGが通常使用する「暗黙の」シーケンスの邪魔になることを意味します。この使用例では、フラグoptional = TrueをSequenceオブジェクトに追加します。これは、データベースが主キー識別子を生成するための他のオプションを提供しない場合にのみ、Sequenceを使用する必要があることを示します。

17
Edwardr

Mysqlとフラスコ移行を使用して他の答えを得ることができなかったので、移行ファイル内で次のようにしました。

from app import db
db.engine.execute("ALTER TABLE myDB.myTable AUTO_INCREMENT = 2000;")

マイグレーションファイルを再生成すると、上書きされることに注意してください。

2
cbron