amazing! I think this might actually work... thanks Mike, will keep the
thread updated with a working solution when I have one
On Thursday, 14 February 2019 18:16:27 UTC, Harry wrote:
>
> Hello SQLAlchemy friends, I'm struggling to get sqlalchemy to do what I
> want.
>
> I'd like to use "classical mappings" so that my business objects are free
> from any direct dependency on sqlalchemy.
>
> I'm representing two different objects that are very similar: customer
> orders and warehouse stock. Both are essentially a collection of lines
> mapping product codes ("sku") to quantities.
>
> here's some not-quite-python pseudocode
>
>
> Objective 1: Order and Warehouse class have a dict attribute representing
> skus and quantities
>
> class Order:
> lines: dict # {sku: qty}
>
>
> class Warehouse:
> lines: dict # {sku: qty}
>
>
> my basic problem here is I can't figure out how to get sqlalchemy to
> populate a dict of raw values (not mapped objects) from a join/related
> table.
>
>
>
> Objective 2 (backup plan) Order and Stock class have an attribute .lines
> which is a list of "Line" objects
>
> class Line:
> sku: str
> qty: int
>
>
> class Order:
> lines: List[Line]
>
>
> class Warehouse:
> lines: List[Line]
>
>
>
>
> my problem here is sqlalchemy really doesn't like a single class (Line)
> being effectively mapped to two tables.
>
>
>
> tables look something like this (actual code)
>
>
> order = Table(
> 'order', metadata,
> Column('id', Integer, primary_key=True, autoincrement=True),
> )
> order_lines = Table(
> 'order_lines', metadata,
> Column('order_id', ForeignKey('order.id'), primary_key=True),
> Column('sku', String(255), primary_key=True),
> Column('qty', Integer),
> )
> warehouse = Table(
> 'warehouse', metadata,
> Column('id', Integer, primary_key=True, autoincrement=True),
> )
> warehouse_lines = Table(
> 'warehouse_lines', metadata,
> Column('warehouse_id', ForeignKey('warehouse.id'), primary_key=True),
> Column('sku', String(255), primary_key=True),
> Column('qty', Integer),
> )
>
>
>
>
> but configuring the mapper is beyond me. I never got anything remotely
> close to working for option 1.
>
> and for option 2, having the ".lines" attribute mapped as a relationship
> but using the same Line class, doesn't seem to work at all:
>
>
> mapper(domain_model.Line, order_lines)
> mapper(domain_model.Order, order, properties={
> 'lines': relationship(domain_model.Line, cascade="all, delete-orphan")
> })
> warehouse_line_mapper = mapper(domain_model.Line, warehouse_lines,
> non_primary=True)
> mapper(domain_model.Warehouse, warehouse, properties={
> 'lines': relationship(warehouse_line_mapper, cascade="all,
> delete-orphan")
> })
>
>
>
> If anyone can help, I'd love to see if I can get option 1 working, where
> sqlalchemy can build dicts for the Order and Warehouse classes using the
> order_lines and warehouse_lines tables, without needing a class to
> represent those lines. alternatively, the backup plan using a single Line
> class for both tables would be a consolation prize. but i'd really like to
> avoid being force to c creating two different classes to represent the
> lines for order and warehouse just to make my orm happy.
>
> gist with stripped-down example code here:
> https://gist.github.com/hjwp/09fd282062e934eeb2a46a40945e48c8
>
>
> thanks in advance!
>
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.