]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
refactor: update example for Declarative API
authorMike Fiedler <miketheman@gmail.com>
Tue, 10 Oct 2023 20:08:33 +0000 (20:08 +0000)
committerMike Fiedler <miketheman@gmail.com>
Tue, 10 Oct 2023 20:18:32 +0000 (20:18 +0000)
examples/generic_associations/table_per_related.py

index 5b83e6e68f36fcc6d8d584d9f8440e30e617d1ce..c7b012dcb09e684faeb6fe25055ee69a7fd0c8d5 100644 (file)
@@ -16,19 +16,18 @@ but there really isn't any - the management and targeting of these tables
 is completely automated.
 
 """
-from sqlalchemy import Column
 from sqlalchemy import create_engine
 from sqlalchemy import ForeignKey
 from sqlalchemy import Integer
-from sqlalchemy import String
-from sqlalchemy.ext.declarative import as_declarative
-from sqlalchemy.ext.declarative import declared_attr
-from sqlalchemy.orm import relationship
+from sqlalchemy.orm import DeclarativeBase
+from sqlalchemy.orm import Mapped
 from sqlalchemy.orm import Session
+from sqlalchemy.orm import declared_attr
+from sqlalchemy.orm import mapped_column
+from sqlalchemy.orm import relationship
 
 
-@as_declarative()
-class Base:
+class Base(DeclarativeBase):
     """Base class which provides automated table name
     and surrogate primary key column.
 
@@ -38,7 +37,7 @@ class Base:
     def __tablename__(cls):
         return cls.__name__.lower()
 
-    id = Column(Integer, primary_key=True)
+    id: Mapped[int] = mapped_column(primary_key=True)
 
 
 class Address:
@@ -51,9 +50,9 @@ class Address:
 
     """
 
-    street = Column(String)
-    city = Column(String)
-    zip = Column(String)
+    street: Mapped[str]
+    city: Mapped[str]
+    zip: Mapped[str]
 
     def __repr__(self):
         return "%s(street=%r, city=%r, zip=%r)" % (
@@ -73,12 +72,12 @@ class HasAddresses:
     @declared_attr
     def addresses(cls):
         cls.Address = type(
-            "%sAddress" % cls.__name__,
+            f"{cls.__name__}Address",
             (Address, Base),
             dict(
-                __tablename__="%s_address" % cls.__tablename__,
-                parent_id=Column(
-                    Integer, ForeignKey("%s.id" % cls.__tablename__)
+                __tablename__=f"{cls.__tablename__}_address",
+                parent_id=mapped_column(
+                    Integer, ForeignKey(f"{cls.__tablename__}.id")
                 ),
                 parent=relationship(cls),
             ),
@@ -87,11 +86,11 @@ class HasAddresses:
 
 
 class Customer(HasAddresses, Base):
-    name = Column(String)
+    name: Mapped[str]
 
 
 class Supplier(HasAddresses, Base):
-    company_name = Column(String)
+    company_name: Mapped[str]
 
 
 engine = create_engine("sqlite://", echo=True)