如何确保属性具有特定值?

时间:2013-02-13 16:08:11

标签: python sqlalchemy constraints

假设我的课程CarManufacturerColorManifacturer定义了汽车可能涂漆的颜色。 Car,Color和Manufacturer都是我在SQLAlchemy中使用declarative_base建模的表。颜色是一个复杂的类,有一些属性。

我想将汽车的颜色限制为制造商指定的颜色。我可以使用约束或类似的东西来限制汽车在SQLAlchemy中获得的颜色,还是我必须在纯Python中检查它?

1 个答案:

答案 0 :(得分:1)

我相信sqlalchemy.types.Enum应该处理你定义的字符串列表所需的内容。

  

Enum类型提供了一组可能的字符串值,该列受限于该列。   默认情况下,使用后端的本机ENUM类型(如果可用),否则使用VARCHAR + CHECK约束。

但是从对象约束级别看它我想象你可以使用带有Check约束的ForeignKey来处理它,但似乎检查约束只是将它直接传递给数据库,所以它会根据你的dbms而有所不同'跑步。 This question goes deeper into the SQL应该能够与SQLAlchemy's Constraints配对。

更简洁,更便携的方式可能是将它构建到构造函数中,或者只是有一个可以在查询被触发之前验证数据的函数

## Using the Car constructor for validation

def __init__(self,color,manufacturer,price=1000):
    if color in manufacturer.allowed_colors:
        self.color = color
        self.manufacturer
    else:
        raise LookupError() # or something more relevant.
    self.price = price

## Or just a generic function that can be called:

def validate_car(color,manufacturer):
    if color in manufacturer.allowed_colors:
        return true
    return false

if validate_car(color,manufacturer):
    car = Car(color,manufacturer)
    session.add(car)

如果是我,这个验证将存在于我的应用程序的郊区。假设一个Web应用程序,这意味着它将在表单级别上进行验证 - 只向用户显示相关的汽车颜色,然后服务器将验证所选颜色以确保没有用户挤压坏数据。所以我会有一个validate_car(color,manufacturer)的函数,但是当表单被处理时它将被调用,如果表单被检出,那么我将创建并添加Car对象。

在dbms本身内具有约束对于级联删除很有趣,例如:如果福特决定停止销售蓝色汽车,那么你可以删除蓝色并且所有蓝色福特汽车都会神奇地消失,但是,我认为如果你要走约束路线,它几乎是手动SQL连接它(虽然我很乐意学习它是不是!)。