0

假设我有一个Car有 aManufacturer和 a的类Color。AManifacturer定义了汽车可以涂上哪种颜色。Car、Color 和 Manufacturer 都是我在 SQLAlchemy 中使用 declarative_base 建模的表。颜色是一个具有一些属性的复杂类。

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

4

1 回答 1

1

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

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

但是从对象约束级别来看,我想您可以使用带有 Check 约束的 ForeignKey 来处理它,但似乎检查约束只是将它直接传递给数据库,因此它会根据您正在运行的 dbms 而有所不同. 这个问题深入到应该能够与SQLAlchemy 的 Constraints配对的 SQL 中。

一种更简洁、更便携的方法可能是将其构建到您的构造函数中,或者仅具有一个可以在触发查询之前验证数据的函数

## 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 来连接它(尽管如果不是,我很乐意学习!)。

于 2013-02-13T16:41:18.103 回答