Note
Go to the end to download the full example code.
New ORM Declarative Mapping StyleΒΆ
SQLAlchemy>=2
introduced a new way to construct mappings using the
sqlalchemy.orm.DeclarativeBase
base class.
This example shows how to use GeoAlchemy2 types in this context.
10 import pytest
11 from pkg_resources import parse_version
12 from sqlalchemy import __version__ as SA_VERSION
13
14 try:
15 from sqlalchemy.orm import DeclarativeBase
16 from sqlalchemy.orm import Mapped
17 from sqlalchemy.orm import mapped_column
18 except ImportError:
19 pass
20
21 from geoalchemy2 import Geometry
22 from geoalchemy2 import WKBElement
23 from geoalchemy2 import shape
24
25
26 def check_wkb(wkb, x, y) -> None:
27 pt = shape.to_shape(wkb)
28 assert round(pt.x, 5) == x
29 assert round(pt.y, 5) == y
30
31
32 @pytest.mark.skipif(
33 parse_version(SA_VERSION) < parse_version("2"),
34 reason="New ORM mapping is only available for sqlalchemy>=2",
35 )
36 def test_ORM_mapping(session, conn, schema) -> None:
37 class Base(DeclarativeBase):
38 pass
39
40 class Lake(Base):
41 __tablename__ = "lake"
42 __table_args__ = {"schema": schema}
43 id: Mapped[int] = mapped_column(primary_key=True)
44 mapped_geom: Mapped[WKBElement] = mapped_column(Geometry(geometry_type="POINT", srid=4326))
45
46 Lake.__table__.drop(conn, checkfirst=True) # type: ignore[attr-defined]
47 Lake.__table__.create(bind=conn) # type: ignore[attr-defined]
48
49 # Create new point instance
50 p = Lake()
51 p.mapped_geom = "SRID=4326;POINT(5 45)" # type: ignore[assignment]
52
53 # Insert point
54 session.add(p)
55 session.flush()
56 session.expire(p)
57
58 # Query the point and check the result
59 pt = session.query(Lake).one()
60 assert pt.id == 1
61 assert pt.mapped_geom.srid == 4326
62 check_wkb(pt.mapped_geom, 5, 45)