gpt4 book ai didi

python - 覆盖用于测试的 SQLAlchemy 列

转载 作者:行者123 更新时间:2023-11-28 18:47:36 24 4
gpt4 key购买 nike

我正在尝试覆盖 SQLAlchemy 列以在我的测试数据库中具有不同的属性。基本上,我的所有 MySQL 表中都有一个复合主键:一个自动增量 BIGINT id 和一个 DATETIME create_time。对于单元测试,我想使用 SQLite,但我的研究让我相信自动增量对于这个用例是不可能的。由于除了在 MySQL 中创建滚动分区外,我没有将 create_time 列用于任何其他用途,因此我想在我的单元测试中覆盖这两列,以便它们与 SQLite 兼容。注意:我使用的是 Base = declarative_base() 路由,我所有的模型都继承了 BasePrimaryKeyMixin

在我的 models.py 中,我创建了一个所有表都继承的 mixin 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)

但是,当我将 echo=True 添加到 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)

关于python - 覆盖用于测试的 SQLAlchemy 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com