]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Added valid types to server_onupdate (#11555)
authoropkna <oscar.persson1993@gmail.com>
Thu, 4 Jul 2024 20:13:10 +0000 (22:13 +0200)
committerGitHub <noreply@github.com>
Thu, 4 Jul 2024 20:13:10 +0000 (22:13 +0200)
* Added valid types to server_onupdate and mapped_column kwargs mypy tests
* Joined mapped_column test files
* Set _ServerOnUpdateArgument to _ServerDefaultArgument

Fixes: #11546
lib/sqlalchemy/orm/_orm_constructors.py
lib/sqlalchemy/sql/schema.py
test/typing/plain_files/orm/mapped_column.py
test/typing/plain_files/sql/core_ddl.py

index 7d215059af0e0715c55e67cc62468db96604b866..c800358456c733fbf69e5c217b86d4308609c2f2 100644 (file)
@@ -71,7 +71,7 @@ if TYPE_CHECKING:
     from ..sql._typing import _TypeEngineArgument
     from ..sql.elements import ColumnElement
     from ..sql.schema import _ServerDefaultArgument
-    from ..sql.schema import FetchedValue
+    from ..sql.schema import _ServerOnUpdateArgument
     from ..sql.selectable import Alias
     from ..sql.selectable import Subquery
 
@@ -129,7 +129,7 @@ def mapped_column(
     onupdate: Optional[Any] = None,
     insert_default: Optional[Any] = _NoArg.NO_ARG,
     server_default: Optional[_ServerDefaultArgument] = None,
-    server_onupdate: Optional[FetchedValue] = None,
+    server_onupdate: Optional[_ServerOnUpdateArgument] = None,
     active_history: bool = False,
     quote: Optional[bool] = None,
     system: bool = False,
index 276e4edf4aa6da969d0c030de525459b8b5f0322..8a1ffba64c3d93cab4ceb5f0c6220ff68c9d84e3 100644 (file)
@@ -126,6 +126,8 @@ _ServerDefaultArgument = Union[
     "FetchedValue", str, TextClause, ColumnElement[Any]
 ]
 
+_ServerOnUpdateArgument = _ServerDefaultArgument
+
 
 class SchemaConst(Enum):
     RETAIN_SCHEMA = 1
@@ -1530,7 +1532,7 @@ class Column(DialectKWArgs, SchemaItem, ColumnClause[_T]):
         onupdate: Optional[Any] = None,
         primary_key: bool = False,
         server_default: Optional[_ServerDefaultArgument] = None,
-        server_onupdate: Optional[FetchedValue] = None,
+        server_onupdate: Optional[_ServerOnUpdateArgument] = None,
         quote: Optional[bool] = None,
         system: bool = False,
         comment: Optional[str] = None,
index 26f5722a6fc04bb97fb71d58947b238146288315..81080a4faa5f4b4f7ac8a73356ea3bd83459c8a2 100644 (file)
@@ -1,13 +1,20 @@
 from typing import Optional
 
+from sqlalchemy import Boolean
+from sqlalchemy import FetchedValue
 from sqlalchemy import ForeignKey
+from sqlalchemy import func
 from sqlalchemy import Index
 from sqlalchemy import Integer
+from sqlalchemy import literal_column
 from sqlalchemy import String
+from sqlalchemy import text
+from sqlalchemy import true
 from sqlalchemy import UniqueConstraint
 from sqlalchemy.orm import DeclarativeBase
 from sqlalchemy.orm import Mapped
 from sqlalchemy.orm import mapped_column
+from sqlalchemy.sql.schema import SchemaConst
 
 
 class Base(DeclarativeBase):
@@ -94,3 +101,84 @@ class X(Base):
     )
 
     __table_args__ = (UniqueConstraint(a, b, name="uq1"), Index("ix1", c, d))
+
+
+mapped_column()
+mapped_column(
+    init=True,
+    repr=True,
+    default=42,
+    compare=True,
+    kw_only=True,
+    primary_key=True,
+    deferred=True,
+    deferred_group="str",
+    deferred_raiseload=True,
+    use_existing_column=True,
+    name="str",
+    type_=Integer(),
+    doc="str",
+    key="str",
+    index=True,
+    unique=True,
+    info={"str": 42},
+    active_history=True,
+    quote=True,
+    system=True,
+    comment="str",
+    sort_order=-1,
+    any_kwarg="str",
+    another_kwarg=42,
+)
+
+mapped_column(default_factory=lambda: 1)
+mapped_column(default_factory=lambda: "str")
+
+mapped_column(nullable=True)
+mapped_column(nullable=SchemaConst.NULL_UNSPECIFIED)
+
+mapped_column(autoincrement=True)
+mapped_column(autoincrement="auto")
+mapped_column(autoincrement="ignore_fk")
+
+mapped_column(onupdate=1)
+mapped_column(onupdate="str")
+
+mapped_column(insert_default=1)
+mapped_column(insert_default="str")
+
+mapped_column(server_default=FetchedValue())
+mapped_column(server_default=true())
+mapped_column(server_default=func.now())
+mapped_column(server_default="NOW()")
+mapped_column(server_default=text("NOW()"))
+mapped_column(server_default=literal_column("false", Boolean))
+
+mapped_column(server_onupdate=FetchedValue())
+mapped_column(server_onupdate=true())
+mapped_column(server_onupdate=func.now())
+mapped_column(server_onupdate="NOW()")
+mapped_column(server_onupdate=text("NOW()"))
+mapped_column(server_onupdate=literal_column("false", Boolean))
+
+mapped_column(
+    default=None,
+    nullable=None,
+    primary_key=None,
+    deferred_group=None,
+    deferred_raiseload=None,
+    name=None,
+    type_=None,
+    doc=None,
+    key=None,
+    index=None,
+    unique=None,
+    info=None,
+    onupdate=None,
+    insert_default=None,
+    server_default=None,
+    server_onupdate=None,
+    quote=None,
+    comment=None,
+    any_kwarg=None,
+)
index b7e0ec5350f99c68a8eb7bf90003350a415c492f..549375d0af264708aed672c9a1b2c1dd72bebc0f 100644 (file)
@@ -138,10 +138,18 @@ Column("name", Integer, server_default=text("now()"), nullable=False)
 Column(Integer, server_default=literal_column("42", Integer), nullable=False)
 
 # server_onupdate
-Column("name", server_onupdate=FetchedValue(), nullable=False)
 Column(server_onupdate=FetchedValue(), nullable=False)
+Column(server_onupdate="now()", nullable=False)
+Column("name", server_onupdate=FetchedValue(), nullable=False)
 Column("name", Integer, server_onupdate=FetchedValue(), nullable=False)
+Column("name", Integer, server_onupdate=text("now()"), nullable=False)
+Column(Boolean, nullable=False, server_default=true())
 Column(Integer, server_onupdate=FetchedValue(), nullable=False)
+Column(DateTime, server_onupdate="now()")
+Column(DateTime, server_onupdate=text("now()"))
+Column(DateTime, server_onupdate=FetchedValue())
+Column(Boolean, server_onupdate=literal_column("false", Boolean))
+Column(Integer, server_onupdate=literal_column("42", Integer), nullable=False)
 
 # TypeEngine.with_variant should accept both a TypeEngine instance and the Concrete Type
 Integer().with_variant(Integer, "mysql")