假设我有一个Car
有 aManufacturer
和 a的类Color
。AManifacturer
定义了汽车可以涂上哪种颜色。Car、Color 和 Manufacturer 都是我在 SQLAlchemy 中使用 declarative_base 建模的表。颜色是一个具有一些属性的复杂类。
我想将汽车的颜色限制为制造商指定的颜色。我可以使用约束或类似的东西限制汽车在 SQLAlchemy 中获得的颜色,还是我必须在纯 Python 中检查?
假设我有一个Car
有 aManufacturer
和 a的类Color
。AManifacturer
定义了汽车可以涂上哪种颜色。Car、Color 和 Manufacturer 都是我在 SQLAlchemy 中使用 declarative_base 建模的表。颜色是一个具有一些属性的复杂类。
我想将汽车的颜色限制为制造商指定的颜色。我可以使用约束或类似的东西限制汽车在 SQLAlchemy 中获得的颜色,还是我必须在纯 Python 中检查?
我相信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 来连接它(尽管如果不是,我很乐意学习!)。