summaryrefslogtreecommitdiff
path: root/examples/generic_associations/table_per_related.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/generic_associations/table_per_related.py')
-rw-r--r--examples/generic_associations/table_per_related.py84
1 files changed, 48 insertions, 36 deletions
diff --git a/examples/generic_associations/table_per_related.py b/examples/generic_associations/table_per_related.py
index 51c9f1b26..9c5e0e179 100644
--- a/examples/generic_associations/table_per_related.py
+++ b/examples/generic_associations/table_per_related.py
@@ -20,17 +20,21 @@ from sqlalchemy.ext.declarative import as_declarative, declared_attr
from sqlalchemy import create_engine, Integer, Column, String, ForeignKey
from sqlalchemy.orm import Session, relationship
+
@as_declarative()
class Base(object):
"""Base class which provides automated table name
and surrogate primary key column.
"""
+
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
+
id = Column(Integer, primary_key=True)
+
class Address(object):
"""Define columns that will be present in each
'Address' table.
@@ -40,74 +44,82 @@ class Address(object):
should be set up using @declared_attr.
"""
+
street = Column(String)
city = Column(String)
zip = Column(String)
def __repr__(self):
- return "%s(street=%r, city=%r, zip=%r)" % \
- (self.__class__.__name__, self.street,
- self.city, self.zip)
+ return "%s(street=%r, city=%r, zip=%r)" % (
+ self.__class__.__name__,
+ self.street,
+ self.city,
+ self.zip,
+ )
+
class HasAddresses(object):
"""HasAddresses mixin, creates a new Address class
for each parent.
"""
+
@declared_attr
def addresses(cls):
cls.Address = type(
"%sAddress" % cls.__name__,
- (Address, Base,),
+ (Address, Base),
dict(
- __tablename__="%s_address" %
- cls.__tablename__,
- parent_id=Column(Integer,
- ForeignKey("%s.id" % cls.__tablename__)),
- parent=relationship(cls)
- )
+ __tablename__="%s_address" % cls.__tablename__,
+ parent_id=Column(
+ Integer, ForeignKey("%s.id" % cls.__tablename__)
+ ),
+ parent=relationship(cls),
+ ),
)
return relationship(cls.Address)
+
class Customer(HasAddresses, Base):
name = Column(String)
+
class Supplier(HasAddresses, Base):
company_name = Column(String)
-engine = create_engine('sqlite://', echo=True)
+
+engine = create_engine("sqlite://", echo=True)
Base.metadata.create_all(engine)
session = Session(engine)
-session.add_all([
- Customer(
- name='customer 1',
- addresses=[
- Customer.Address(
- street='123 anywhere street',
- city="New York",
- zip="10110"),
- Customer.Address(
- street='40 main street',
- city="San Francisco",
- zip="95732")
- ]
- ),
- Supplier(
- company_name="Ace Hammers",
- addresses=[
- Supplier.Address(
- street='2569 west elm',
- city="Detroit",
- zip="56785")
- ]
- ),
-])
+session.add_all(
+ [
+ Customer(
+ name="customer 1",
+ addresses=[
+ Customer.Address(
+ street="123 anywhere street", city="New York", zip="10110"
+ ),
+ Customer.Address(
+ street="40 main street", city="San Francisco", zip="95732"
+ ),
+ ],
+ ),
+ Supplier(
+ company_name="Ace Hammers",
+ addresses=[
+ Supplier.Address(
+ street="2569 west elm", city="Detroit", zip="56785"
+ )
+ ],
+ ),
+ ]
+)
session.commit()
for customer in session.query(Customer):
for address in customer.addresses:
print(address)
- print(address.parent) \ No newline at end of file
+ print(address.parent)