the idea is like this:

myproject/
myproject/__init__.py
myproject/meta.py
myproject/somepackage/__init__.py
myproject/somepackage/a.py
myproject/someotherpackage/__init__.py
myproject/someotherpackage/b.py

myproject/__init__.py:

from myproject.somepackage import a
from myproject.someotherpackage import b

meta.py:

Base = declarative_base()

a.py:

from myproject.meta import Base

b.py:

from myproject.meta import Base










On Feb 8, 2011, at 2:25 PM, Martijn Moeling wrote:

> Michael,
> 
> Do you ever sleep?
> 
> I am not sure I get your point. How do I set up a common "Base". 
> 
> I could do Base= Declarative_base()
> 
> from a import A (or * not sure how this differs in this case)
> from b import B (or *)
> 
> If I do not declare Base in module "a" I get an Import Error on class 
> A(Base), the same for importing b. 
> 
> This gets even more complicated when Base should be build from classes 
> defined across modules.
> 
> at the end there is one main.py importing all modules and this should be able 
> to define the "Main Base".
> 
> Any suggestions on how to tackle this. I know have multiple modules and am 
> glueing everything together. This even gets more problematic with Inheritance.
> 
> one solution could be..
> 
> from a import A, BaseA 
> from b import B, BaseB
> 
> Base = declarative_base() 
> 
> metadata - BaseA.metadata + BaseB.metadata
> metadata.create_all(engine)
> 
> What I do not get is how the mapper is configured. Normally with declarative 
> Base it is not used in "Production fase" for as far as I can see.....
> The mapper is part of the Class right? and session does not use Base at all? 
> but gets it when needed -> Session.query(A)..... ?
> Or am I totally wrong on this?
> 
> Can I something like this:
> 
> from a import * (imports class A and the declarative_base BaseA)
> 
> Base = declarative_base()
> 
> class C(Base):
>      .......
> 
> BaseForB = declarative_base(metadata=BaseA)
> class B(BaseForB)
> 
> 
> Mixin classes are of type object so there is no issue since @declared_attr 
> etc works....
> 
> class D(Base,mixinclass) works without a Base at all so there is no Issue....
> 
> Am I right? in understanding your comments on my first mail in this topic?
> 
> Martijn
> 
> 
> 
> 
> 
> 
> 
> On Feb 8, 2011, at 7:46 PM, Michael Bayer wrote:
> 
>> 
>> On Feb 8, 2011, at 1:19 PM, Martijn Moeling wrote:
>> 
>>> Hi,
>>> 
>>> I am having a small issue with multiple python modules and declarative...
>>> 
>>> I might miss something but....
>>> 
>>> Consider:
>>> 
>>> a.py:
>>> 
>>> 8<-------------------------------
>>> Base = declarative_base()
>>> 
>>> class A(Base):
>>>     ...
>>> 8<-------------------------------
>>> 
>>> b.py
>>> Base = declarative_base()
>>> 
>>> class B(Base):
>>>     ...
>>> 8<-------------------------------
>>> 
>>> c.py
>>> Base = declarative_base()
>>> 
>>> class C(Base):
>>>     ...
>>> 8<-------------------------------
>>> 
>>> d.py
>>> 
>>> Base = declarative_base()
>>> 
>>> from A import * # imports base.... 
>>> from B import * # imports base....
>>> from C import * # imports base....
>>> 
>>> Class D1(Base)
>>> ...
>>> 
>>> Class D2(A)
>>> ...
>>> 
>>> 
>>> in d.py I want to create:
>>> 
>>> def create_tables(engine):
>>>     metadata= Base.metadata
>>>     metadata.create_all(engine)
>>> 
>>> 
>>> Is there any way to properly "add" the metadata from the imported modules 
>>> in d.py  to the Base.metadata during the import......?
>>> Think of modules a,b,c and d are together in a package and d is imported 
>>> with similar packages into something bigger....
>> 
>> Usually the convention is that all modules in an application share the same 
>> declarative base object (i.e. Base).   If you wanted multiple Base objects 
>> but have them share a common MetaData, you can declare the MetaData up 
>> front, then create each Base using declarative_base(metadata=my_metadata).   
>>   Otherwise if you're really looking to merge together multiple MetaData 
>> objects, that's not really in the API right now in a clean way, you'd 
>> perhaps call .tometadata() on each Table object but that's really not what I 
>> would do here - it copies the whole Table object and isn't really for a use 
>> case like this.   If you can at least have a common MetaData object, or 
>> better a common Base object, that would be the best way to go.
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "sqlalchemy" group.
>> To post to this group, send email to sqlalchemy@googlegroups.com.
>> To unsubscribe from this group, send email to 
>> sqlalchemy+unsubscr...@googlegroups.com.
>> For more options, visit this group at 
>> http://groups.google.com/group/sqlalchemy?hl=en.
>> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to