테스트 데이터베이스에 다른 특성을 갖도록 SQLAlchemy 열을 재정의하려고합니다. 기본적으로 모든 MySQL 테이블에는 복합 기본 키 (BIGINT id
및 DATETIME create_time
)가 있습니다. 유닛 테스팅을 위해 SQLite를 사용하고 싶지만, 내 연구를 통해이 유스 케이스에서는 자동 증가가 불가능하다고 생각하게되었습니다. create_time
열을 MySQL에서 롤업 파티션을 만드는 것 이외의 다른 용도로 사용하지 않으므로 단위 테스트의 두 열을 재정의하여 SQLite와 호환되도록하고 싶습니다. 참고 : Base = declarative_base()
경로를 사용하고 있으며 내 모델은 모두 Base
및 PrimaryKeyMixin
을 상속합니다.테스트 용 SQLAlchemy 열 무시
내 models.py에서 모든 테이블이 상속하는 믹스 PrimaryKeyMixin
을 만들었습니다. 모든 테이블은 __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)
을 그러나, 나는 각 테이블에 대해 엔진에 진정한 =, 그것은 여전히 primary_key와를 만드는 (ID, CREATE_TIME)를 에코 추가 할 때 .
Base.metadata = MetaData()
def copy_table(model):
Table(model.__tablename__, Base.metadata, *change_columns(model.__table__.columns), sqlite_autoincrement=True)
def change_columns(columns):
new_cols = [column.copy() for column in columns if column.name != 'id' and column.name !='create_time']
new_cols.append(Column('id', INT(unsigned=True), primary_key=True, autoincrement=True))
new_cols.append(Column('create_time', DATETIME, default=func.now(), autoincrement=True))
return new_cols
for model in PrimaryKeyMixin.__subclasses__():
copy_table(model)
: