from ..util.typing import TupleAny
from ..util.typing import Unpack
+
if TYPE_CHECKING:
from ._typing import _FromClauseArgument
from ._typing import _OnClauseArgument
from ._typing import _SelectStatementForCompoundArgument
+ from ._typing import _DMLColumnArgument
from ._typing import _T0
from ._typing import _T1
from ._typing import _T2
def values(
- *columns: ColumnClause[Any],
+ *columns: _DMLColumnArgument[Any],
name: Optional[str] = None,
literal_binds: bool = False,
) -> Values:
from ._typing import _NOT_ENTITY
from ._typing import _OnClauseArgument
from ._typing import _SelectStatementForCompoundArgument
+ from ._typing import _DMLColumnArgument
from ._typing import _T0
from ._typing import _T1
from ._typing import _T2
def __init__(
self,
- *columns: ColumnClause[Any],
+ *columns: _DMLColumnArgument[Any],
name: Optional[str] = None,
literal_binds: bool = False,
):
self,
fn: Callable[[Select[Unpack[TupleAny]]], Select[Unpack[TupleAny]]],
) -> ScalarSelect[Any]:
-
assert isinstance(self.element, ScalarSelect)
element = self.element.element
if not isinstance(element, Select):
--- /dev/null
+from sqlalchemy import update
+from sqlalchemy import values
+
+from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
+
+
+class DbBase(DeclarativeBase):
+ pass
+
+
+class MyTable(DbBase):
+ __tablename__ = "my_table"
+
+ id: Mapped[int] = mapped_column(primary_key=True)
+ name: Mapped[str]
+
+
+update_values = values(
+ MyTable.id,
+ MyTable.name,
+ name="update_values",
+).data([(1, "Alice"), (2, "Bob")])
+
+query = (
+ update(MyTable)
+ .values(
+ {
+ MyTable.name: update_values.c.name,
+ }
+ )
+ .where(MyTable.id == update_values.c.id)
+)