1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
# NOPLUGINS
# this should pass typing with no plugins
from typing import Any
from typing import List
from typing import Mapping
from typing import Optional
from sqlalchemy import Column
from sqlalchemy import create_engine
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
from sqlalchemy import select
from sqlalchemy import String
from sqlalchemy import Table
from sqlalchemy.orm import registry
from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session
from sqlalchemy.orm.attributes import Mapped
from sqlalchemy.orm.decl_api import DeclarativeMeta
class Base(metaclass=DeclarativeMeta):
__abstract__ = True
registry = registry()
metadata = registry.metadata
class A(Base):
__table__ = Table(
"a",
Base.metadata,
Column("id", Integer, primary_key=True),
Column("data", String),
)
__mapper_args__: Mapping[str, Any] = {
"properties": {"bs": relationship("B")}
}
id: Mapped[int]
data: Mapped[str]
bs: "Mapped[List[B]]"
def __init__(
self,
id: Optional[int] = None, # noqa: A002
data: Optional[str] = None,
bs: "Optional[List[B]]" = None,
):
self.registry.constructor(self, id=id, data=data, bs=bs)
class B(Base):
__table__ = Table(
"b",
Base.metadata,
Column("id", Integer, primary_key=True),
Column("a_id", ForeignKey("a.id")),
Column("data", String),
)
id: Mapped[int]
a_id: Mapped[int]
data: Mapped[str]
def __init__(
self,
id: Optional[int] = None, # noqa: A002
a_id: Optional[int] = None,
data: Optional[str] = None,
):
self.registry.constructor(self, id=id, a_id=a_id, data=data)
e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)
s = Session(e)
a1 = A(data="some data", bs=[B(data="some data")])
x: List[B] = a1.bs
s.add(a1)
s.commit()
# illustrate descriptor working at the class level, A.data.in_()
stmt = (
select(A.data, B.data)
.join(B)
.where(A.data.in_(["some data", "some other data"]))
)
for row in s.execute(stmt):
print(row)
|