>
>
> it's the "functional at each level" part that I think goes beyond what 
> is practical.   When you run an operation on a superclass, and it 
> expects to do ORM operations, it has to be referring to the ultimate 
> mapped class.  The ORM is designed with the idea that the concrete 
> instantiation classes are the ones that are ultimately mapped and 
> dealt with in terms of persistence. 


Okay, that is something that I get. However, if you extend the baseclass 
strictly hierarchical and only make one concrete class for each derived 
level that you want to operate at (lets say each level isolated in a 
package), the notion of an 'ultimate' derived class should be well defined, 
and so should be programming-technically resolvable (So i understand 
sqlalchemy already does some class-inspections under the hood, even though 
I do not know by which mechanics that is governed):
I mean something like this (\/ and > should mean 'derives to'):

--- level 0 ---
Base
\/
OBJ01_Declared_lvl0 > OBJ01_Mapped_lvl0

--- level A ---
\/
OBJ01_Extended_lvlA > OBJ01_Mapped_lvlA

--- level B ---
\/
OBJ01_Extended_lvlB > OBJ01_Mapped_lvlB



  It should be apparent that it 
> would be vastly more complicated to make it also "know" about all 
> kinds of arbitrary subclasses. 


You are correct, that from one derived concrete class knowing the identity 
of another other derived concrete class of the object it should relate to 
(relationship(<>)) is hard, and cannot be defined at the baseclass 
level (possibly where you declare the table) alone. However, I also saw 
that relationships can be specified by either giving the class of the to be 
related to object or by its class-name (a string). As this name needs to be 
resolved to some object at some point by inspection of the namespace (or 
brute forcing it), cant this resolving not be delayed until this very 
relationship is used?
A way to potentially resolve this could be that you would kind of use a 
'derived_level_Mixin' that you assign to all Mapped classes at each level; 
so inspecting for this trait in your querying class and the class to be 
resulted should make things uniquely identifiable.

My Ideal solution would look so that all mapped would actually go by the 
same class-name, however, by being in different modules they 
fully-qualified names should still be unique. This would make it more 
convenient to use, as the classes follow the same basic-interface, while 
the highest derived class in the highest level package provides most 
functionality

--- script1.py ---
from myproj_lvlA import Source
...
session.add(Source('MySource'))
session.commit()
s = session.query(Source).first()
print(Source)

--- script2.py ---

from myproj_lvlB import Source  #<< import from higher level module
...
session.add(Source('MySource'))
session.commit()
s = session.query(Source).first()
print(Source)
s.move_to_loc_by_name('MyLocation') #<< functionality only accessible at 
myprojB


 

>   How would you propose the identity 
> map issue I illustrated before function? That is, if i query for 
> Class_lvlA and later for Class_lvlB, what identity key should they 
> have?   If you say they should have the same identity key, what if 
> both Class_lvlA and Class_lvlB perform an operation against the same 
> Session - there is only one Class_<xyz> object in the identity map, 
> suppose it is Class_lvlA, now Class_lvlB consults for its own class 
> and gets the wrong answer.   If you propose they should have 
> individual identity keys, then how do these two classes consult for 
> the same row in the identity map?


You are correct, that a session should not be expected to handle objects of 
different level (Class_lvlA & Class_lvlB) at the same time, as this could 
potentially lead to conflicts, also as I understand it is not allowed to 
map the same table to multiple different, inherently distinct, classes at 
the same time (which i think is good). I am not 

 

>       I appreciate that you are 
> going for some particular level of purity in your design, however I 
> believe there is some conflation here of separation of concerns vs. 
> concrete instantiation patterns. 
>

Yesterday, I found out some interesting properties, that one can make 
declarations which use the sqlalchemy-metadata and declarative base, but 
without visiting/importing the module in question this code is not actually 
executed, resp. the definitions are not actually added to the metadata or 
the mappers. It might be possible to exploit this to make a construct as 
depicted above happen (i.e. not visiting/importing the modules declaring 
mappers for all mapped classes below the current level). I am not sure if 
this will not eventually violate some rules of good programming practice...

Thanks Marcel

 

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/e35db530-4492-4f8f-9736-90721875a27b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to