私は、Flask と SQLAlchemy (Flask-SQLAlchemy 拡張機能を介して) をFactory_Boyと共に使用しています。
私のGearItem
モデルには への外部キーがありGearCategory
ます。Factory_BoySubFactory
は、元のファクトリで外部キーとして使用されるオブジェクトを作成する関数を通じてこれを処理します。
ここに私のモデル定義があります:
class GearCategory(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text, unique=True, nullable=False)
gear_items = db.relationship('GearItem', backref='category',
lazy='dynamic', order_by='GearItem.name')
class GearItem(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text, nullable=False, index=True)
category_id = db.Column(db.Integer, db.ForeignKey('gear_category.id'), index=True)
そして、これが私の factory_boyFactory
定義です。
class GearCategoryFactory(BaseFactory): # Based on factory.alchemy.SQLAlchemyModelFactory
class Meta:
model = gear_models.GearCategory
name = factory.LazyAttribute(lambda n: faker.word())
class GearItemFactory(BaseFactory):
class Meta:
model = gear_models.GearItem
name = factory.LazyAttribute(lambda n: faker.word())
category_id = factory.SubFactory(GearCategoryFactory)
問題なく呼び出すことができ、外部キーとして使用することを目的とした aと親のGearItemFactory()
両方を明確に生成しています。GearItem
GearCategory
ただし、 を呼び出すと、SQLAlchemy は によって作成されたオブジェクトを、外部キーとして使用できる整数にdb.session.flush()
変換しません。SubFactory
代わりに、オブジェクト自体を基礎となるデータベース ドライバーに渡そうとしますが、データベース ドライバーは、 type のオブジェクトを処理する方法がわからないことを訴えますGearCategory
。
私が得ているエラーはsqlalchemy.exc.ProgrammingError: (db_driver) can't adapt type 'GearCategory' [SQL: 'INSERT INTO gear_item (...
私は何を間違っていますか?