Clear, if all packages are in the same project that is......

and what if in a.py I want to inherit some class mapped with b.py .... 

mixin does not allways work as a solution subclassing (DeclarativeMeta) is an 
option, not sure

Once I do a base=declarative_base(metadata=BaseB)

every class x(Base) gets the Columns in BaseB to it ......?

I have been setting up some tests and one way or the other I need to know how 
Session is using Base, if I can have multiple declarative_base instances and 
how Session relates to that.


Consider this:

Base = Declarative_base()

class a(Base):
        ....
        ....
        ....

def create_table(engine):
        b=a()
        metadata = b.metadata
        metadata.create_all(engine)

Base = None      # IMPORTANT IS Sessionmaker using intropsection to find out an 
instance of Declarative base?

engine = ....
Session = SessionMaker(bind=engine)

would this or a  similar approach work?


On Feb 8, 2011, at 9:12 PM, Michael Bayer wrote:

> 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.
> 

-- 
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