Kể từ phiên bản 0.7.4 sqlalchemy.sql.expression.update cho phép bạn tham chiếu đến nhiều bảng trong mệnh đề WHERE. Với điều này, bạn có thể xây dựng và thực thi một biểu thức như:
users.update().values(name='ed').where(
users.c.name==select([addresses.c.email_address]).\
where(addresses.c.user_id==users.c.id).\
as_scalar()
)
(ví dụ trực tiếp từ liên kết ở trên)
Vấn đề mà ValAyal đang gặp phải thực sự là do Query.join()
không được hỗ trợ với Query.update()
. Thật không may, cho đến 0.9.1, điều này đã âm thầm tạo ra các truy vấn như ValAyal đã chia sẻ ở trên. ghi chú thay đổi cho 0.9.1
lưu ý rằng hành vi đã được sửa đổi để phát ra cảnh báo:
Chúng tôi thực sự gặp phải vấn đề này tại nơi tôi làm việc tối nay và nhận thấy rằng mã của chúng tôi trên thực tế đang phát ra cảnh báo sau (cho biết nó sẽ xảy ra lỗi trong phiên bản 1.0):
SAWarning: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called. This will be an exception in 1.0
self._validate_query_state()
Trong trường hợp của chúng tôi, chúng tôi đã chọn chuyển đổi cập nhật thành một lựa chọn và cập nhật thành một bảng.