2013-07-15 2 views
3

테스트 데이터베이스에 다른 특성을 갖도록 SQLAlchemy 열을 재정의하려고합니다. 기본적으로 모든 MySQL 테이블에는 복합 기본 키 (BIGINT id 및 DATETIME create_time)가 있습니다. 유닛 테스팅을 위해 SQLite를 사용하고 싶지만, 내 연구를 통해이 유스 케이스에서는 자동 증가가 불가능하다고 생각하게되었습니다. create_time 열을 MySQL에서 롤업 파티션을 만드는 것 이외의 다른 용도로 사용하지 않으므로 단위 테스트의 두 열을 재정의하여 SQLite와 호환되도록하고 싶습니다. 참고 : Base = declarative_base() 경로를 사용하고 있으며 내 모델은 모두 BasePrimaryKeyMixin을 상속합니다.테스트 용 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) 
:

답변

0

이처럼나요