テスト DB で異なる属性を持つように SQLAlchemy 列をオーバーライドしようとしています。基本的に、すべての MySQL テーブルに複合主キー (自動インクリメント BIGINTid
と DATETIME ) がありcreate_time
ます。単体テストには SQLite を使用したいと考えていますが、調査の結果、このユース ケースでは自動インクリメントは不可能であると確信しました。create_time
MySQL でローリング パーティションを作成する以外に列を使用しないため、単体テストで 2 つの列をオーバーライドして、SQLite と互換性を持たせたいと考えています。注: 私はBase = declarative_base()
ルートを使用しており、すべてのモデルが and を継承Base
していPrimaryKeyMixin
ます。
私の models.py では、PrimaryKeyMixin
すべてのテーブルが継承する mixin を作成しました。すべてのテーブルもコンポーネントを継承TABLE_ARGS
し__table_args__
ます。
TABLE_ARGS = {
'mysql_engine': 'InnoDB',
'mysql_charset': 'utf8'
}
class PrimaryKeyMixin:
id = Column(BIGINT(unsigned=True), primary_key=True, autoincrement=True)
create_time = Column(DATETIME, primary_key=True, default=func.now())
単体テストでは、次のことを行います。
from myapp.models import TABLE_ARGS, PrimaryKeyMixin, Column, INT, DATETIME, func
TABLE_ARGS['sqlite_autoincrement'] = True
PrimaryKeyMixin.id = Column(INT(unsigned=True), primary_key=True, autoincrement=True)
PrimaryKeyMixin.create_date = Column(DATETIME, default=func.now())
TEST_DB = '/tmp/myapp_test.db'
from myapp import db
from myapp.models import Base
db.ENGINE = create_engine(
'sqlite:///%s' % TEST_DB,
encoding='utf-8',
)
Base.metadata.drop_all(db.ENGINE)
Base.metadata.create_all(db.ENGINE)
ただし、エンジンに echo=True を追加すると、テーブルごとに PRIMARY_KEY (id, create_time) が作成されます。