30

SQLAlchemyのautoincrement引数は と のみの​​ようTrueですが、次の挿入が行われたときにautoincrement を介してFalse、事前に定義された値を設定したいと考えています。aid = 1001aid = 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)

それで、どうすればそれを手に入れることができますか?前もって感謝します!

4

5 に答える 5

24

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

from sqlalchemy import event
from sqlalchemy import DDL
event.listen(
    Article.__table__,
    "after_create",
    DDL("ALTER TABLE %(table)s AUTO_INCREMENT = 1001;")
)
于 2012-05-08T14:03:10.793 に答える
20

ドキュメントによると:

autoincrement –このフラグをFalseに設定して、「autoincrement」列と見なしてはならない整数の主キー列、つまりINSERT時に暗黙的に値を生成し、通常はDBAPIcursor.lastrowid属性。単一の整数の主キー列を持つテーブルの一般的な使用例を満たすために、デフォルトでTrueに設定されています。

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

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

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

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の点に注意してください。

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

于 2012-05-08T08:51:16.090 に答える
2

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

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

移行ファイルを再生成すると、上書きされることに注意してください。

于 2014-05-15T18:37:01.897 に答える