repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
default: Optional[Any] = _NoArg.NO_ARG,
default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
+ compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
nullable: Optional[
Union[bool, Literal[SchemaConst.NULL_UNSPECIFIED]]
specifies a default-value generation function that will take place
as part of the ``__init__()``
method as generated by the dataclass process.
+ :param compare: Specific to
+ :ref:`orm_declarative_native_dataclasses`, indicates if this field
+ should be included in comparison operations when generating the
+ ``__eq__()`` and ``__ne__()`` methods for the mapped class.
+
+ .. versionadded:: 2.0.0b4
+
:param kw_only: Specific to
:ref:`orm_declarative_native_dataclasses`, indicates if this field
should be marked as keyword-only when generating the ``__init__()``.
autoincrement=autoincrement,
insert_default=insert_default,
attribute_options=_AttributeOptions(
- init, repr, default, default_factory, kw_only
+ init, repr, default, default_factory, compare, kw_only
),
doc=doc,
key=key,
repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
default: Optional[Any] = _NoArg.NO_ARG,
default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
+ compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
active_history: bool = False,
expire_on_flush: bool = True,
column,
*additional_columns,
attribute_options=_AttributeOptions(
- init, repr, default, default_factory, kw_only
+ init, repr, default, default_factory, compare, kw_only
),
group=group,
deferred=deferred,
repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
default: Optional[Any] = _NoArg.NO_ARG,
default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
+ compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
info: Optional[_InfoType] = None,
doc: Optional[str] = None,
repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
default: Optional[Any] = _NoArg.NO_ARG,
default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
+ compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
info: Optional[_InfoType] = None,
doc: Optional[str] = None,
repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
default: Optional[Any] = _NoArg.NO_ARG,
default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
+ compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
info: Optional[_InfoType] = None,
doc: Optional[str] = None,
specifies a default-value generation function that will take place
as part of the ``__init__()``
method as generated by the dataclass process.
+
+ :param compare: Specific to
+ :ref:`orm_declarative_native_dataclasses`, indicates if this field
+ should be included in comparison operations when generating the
+ ``__eq__()`` and ``__ne__()`` methods for the mapped class.
+
+ .. versionadded:: 2.0.0b4
+
:param kw_only: Specific to
:ref:`orm_declarative_native_dataclasses`, indicates if this field
should be marked as keyword-only when generating the ``__init__()``.
_class_or_attr,
*attrs,
attribute_options=_AttributeOptions(
- init, repr, default, default_factory, kw_only
+ init, repr, default, default_factory, compare, kw_only
),
group=group,
deferred=deferred,
repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
default: Union[_NoArg, _T] = _NoArg.NO_ARG,
default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
+ compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
lazy: _LazyLoadArgumentType = "select",
passive_deletes: Union[Literal["all"], bool] = False,
specifies a default-value generation function that will take place
as part of the ``__init__()``
method as generated by the dataclass process.
+ :param compare: Specific to
+ :ref:`orm_declarative_native_dataclasses`, indicates if this field
+ should be included in comparison operations when generating the
+ ``__eq__()`` and ``__ne__()`` methods for the mapped class.
+
+ .. versionadded:: 2.0.0b4
+
:param kw_only: Specific to
:ref:`orm_declarative_native_dataclasses`, indicates if this field
should be marked as keyword-only when generating the ``__init__()``.
cascade=cascade,
viewonly=viewonly,
attribute_options=_AttributeOptions(
- init, repr, default, default_factory, kw_only
+ init, repr, default, default_factory, compare, kw_only
),
lazy=lazy,
passive_deletes=passive_deletes,
repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
default: Union[_NoArg, _T] = _NoArg.NO_ARG,
default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
+ compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
info: Optional[_InfoType] = None,
doc: Optional[str] = None,
descriptor=descriptor,
comparator_factory=comparator_factory,
attribute_options=_AttributeOptions(
- init, repr, default, default_factory, kw_only
+ init, repr, default, default_factory, compare, kw_only
),
doc=doc,
info=info,
repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
default: Optional[Any] = _NoArg.NO_ARG,
default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
+ compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
active_history: bool = False,
expire_on_flush: bool = True,
column,
*additional_columns,
attribute_options=_AttributeOptions(
- init, repr, default, default_factory, kw_only
+ init, repr, default, default_factory, compare, kw_only
),
group=group,
deferred=True,
_NoArg.NO_ARG,
_NoArg.NO_ARG,
_NoArg.NO_ARG,
+ _NoArg.NO_ARG,
),
expire_on_flush=expire_on_flush,
info=info,
from sqlalchemy import select
from sqlalchemy import String
from sqlalchemy import testing
+from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import column_property
from sqlalchemy.orm import composite
from sqlalchemy.orm import DeclarativeBase
),
)
+ def test_compare(self, dc_decl_base: Type[MappedAsDataclass]):
+ class A(dc_decl_base):
+ __tablename__ = "a"
+
+ id: Mapped[int] = mapped_column(primary_key=True, compare=False)
+ data: Mapped[str]
+
+ a1 = A(id=0, data="foo")
+ a2 = A(id=1, data="foo")
+ eq_(a1, a2)
+
@testing.only_if(lambda: compat.py310, "python 3.10 is required")
def test_kw_only(self, dc_decl_base: Type[MappedAsDataclass]):
class A(dc_decl_base):
id: Mapped[int] = mapped_column(primary_key=True, init=False)
- @testing.combinations(True, False)
- def test_attribute_options(self, args):
- if args:
+ @testing.variation("use_arguments", [True, False])
+ @testing.combinations(
+ mapped_column,
+ lambda **kw: synonym("some_int", **kw),
+ lambda **kw: column_property(Column(Integer), **kw),
+ lambda **kw: deferred(Column(Integer), **kw),
+ lambda **kw: composite("foo", **kw),
+ lambda **kw: relationship("Foo", **kw),
+ lambda **kw: association_proxy("foo", "bar", **kw),
+ argnames="construct",
+ )
+ def test_attribute_options(self, use_arguments, construct):
+ if use_arguments:
kw = {
- "init": True,
- "repr": True,
- "default": True,
+ "init": False,
+ "repr": False,
+ "default": False,
"default_factory": list,
- "kw_only": True,
+ "compare": True,
+ "kw_only": False,
}
- exp = interfaces._AttributeOptions(True, True, True, list, True)
+ exp = interfaces._AttributeOptions(
+ False, False, False, list, True, False
+ )
else:
kw = {}
exp = interfaces._DEFAULT_ATTRIBUTE_OPTIONS
- for prop in [
- mapped_column(**kw),
- synonym("some_int", **kw),
- column_property(Column(Integer), **kw),
- deferred(Column(Integer), **kw),
- composite("foo", **kw),
- relationship("Foo", **kw),
- ]:
- eq_(prop._attribute_options, exp)
+ prop = construct(**kw)
+ eq_(prop._attribute_options, exp)
class MixinColumnTest(fixtures.TestBase, testing.AssertsCompiledSQL):