假设我的课程Car
有Manufacturer
和Color
。 Manifacturer
定义了汽车可能涂漆的颜色。 Car,Color和Manufacturer都是我在SQLAlchemy中使用declarative_base建模的表。颜色是一个复杂的类,有一些属性。
我想将汽车的颜色限制为制造商指定的颜色。我可以使用约束或类似的东西来限制汽车在SQLAlchemy中获得的颜色,还是我必须在纯Python中检查它?
答案 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连接它(虽然我很乐意学习它是不是!)。