Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过更改主列对表进行子类化?_Python_Testing_Sqlalchemy - Fatal编程技术网

Python 如何通过更改主列对表进行子类化?

Python 如何通过更改主列对表进行子类化?,python,testing,sqlalchemy,Python,Testing,Sqlalchemy,我想使用SQLAlchemy向数据库添加一些测试装置。它应该获取或设置相应的值。我试图创建一个模型方法,如:ProductsModel.sure(name=“Dettol”),它将确保数据库中的数据与name列相对应,其中Products的定义如下: 产品 类产品(基本): __tablename_uu=‘产品’ idn=列(整数) 名称=列(字符串,主键=True) ProductsModel。确保将根据组合键(name在本例中)执行唯一行检查,并决定是否必须获取或设置它 但是,我无法修改

我想使用SQLAlchemy向数据库添加一些测试装置。它应该
获取
设置
相应的值。我试图创建一个模型方法,如:
ProductsModel.sure(name=“Dettol”)
,它将确保数据库中的数据与
name
列相对应,其中
Products
的定义如下:

产品

类产品(基本):
__tablename_uu=‘产品’
idn=列(整数)
名称=列(字符串,主键=True)
ProductsModel。确保
将根据组合键(
name
在本例中)执行唯一行检查,并决定是否必须获取或设置它


但是,我无法修改真实的
产品
表定义,该表定义(在别处)使用
id
作为主键,如下所示:

类产品(基本):
__tablename_uu=‘产品’
idn=列(整数,主键=True)
名称=列(字符串)
那么,我是否可以继承表并修改测试夹具用例的主键

我试过这样的方法:

class ProductsUnique(产品):
__映射器参数={
“多态性身份”:“产品身份”,
“多态”:Products.idn,希望我可以覆盖idn。
}
idn=列(整数)
名称=列(字符串,主键=True)
但它说:

sqlalchemy.exc.ArgumentError: Column 'idn' on class <class '__main__.ProductsUnique'> conflicts with existing column 'products.idn'
sqlalchemy.exc.ArgumentError:类上的列“idn”与现有列“products.idn”冲突
我相信,在原始表上设置
polymorphic_on
可以解决这个问题;但问题是我在那里做不到

在定义了类之后,有没有办法设置它?SQLAlchemy存储库中似乎有类似的代码


PS:读了很多帖子后,我想我正在寻找类似Django的东西;但我想更清楚我桌子的位置。我不确定是否存在解决此问题的现有解决方案。

为什么需要修改主键以检查行是否存在?您不能使用
会话.合并
,但您可以自己执行检查:

class Product:
    @classmethod
    def get_or_create(cls, name):
        query = session.query(Product).filter_by(name=name)
        result = query.one_or_none()
        if not result:
            result = Product(name=name)
            session.add(result)
            session.commit()
            # maybe load again here to prevent an unexpected one later
        return result
如果您担心比赛条件:

  • 向列添加唯一约束
  • 你可能应该重写你的测试