title: Share Declarative_Base (SQLAlchemy) with Singleton in Python
body: <p>I can run normally SQLAlchemy when everything is in one file. I now want to put my model into another file.</p>
  
  <p>However, this does not work because I can not find a way to share the base. I tried with a Singleton but it is Null in model.py and the schema is never created in the database.</p>
  
  <p>How can I do to fix this?</p>
  
  <p>My files (simplified version) :</p>
  
  <pre><code>     - /main/__init__.py
       - /main/main.py
       - /utils/__init__.py
       - /utils/utils.py
       - /model/__init__.py
       - /model/model.py
  </code></pre>
  
  <p>main/main.py :</p>
  
  <pre><code>from model import User
  from utils.utils import readConf,createSession,getBase
  
  class Worker(threading.Thread): 
  
      def __init__(self, queue, session):
          self.__queue = queue
          threading.Thread.__init__(self)
          self._stopevent = threading.Event( )
  
      def run(self):
          session.merge(User(queue.get()))
          session.commit()
  
  
  class Collector(threading.Thread):
  
      def __init__(self, nom = ''):
          threading.Thread.__init__(self)
          self.nom = nom
          self._stopevent = threading.Event( )
  
  
      def run(self):
          while not self._stopevent.isSet():
              queue.put("Name")
  
  if __name__ == '__main__':
      conf = readConf("file.")
      session = createSession(conf)
      queue = Queue.Queue(0)      
      Worker(queue, session).start()
      Collector("Start").start()
  </code></pre>
  
  <p>utils/utils.py</p>
  
  <pre><code>from sqlalchemy.ext.declarative import declarative_base
  from sqlalchemy.schema import MetaData
  
  def createSession(conf):
      schema = conf['bdd']['type'] + '://' + conf['bdd']['user'] + ':' + conf['bdd']['password'] + '@' + conf['bdd']['host'] + '/' + conf['bdd']['db']
      engine = create_engine(schema, echo=True)
  
      b = getBase("Utils")
      b.set_base(declarative_base())
  
      Base = b.get_base()    
      Base.metadata.create_all(engine)     
  
      Session = sessionmaker(bind=engine)
      session = Session()
      return session
  
  class getBase(object):
      __single = None # the one, true Singleton
      __base = None
      __text = None
      __base = None
  
      def __new__(cls, *args, **kwargs):
          # Check to see if a __single exists already for this class
          # Compare class types instead of just looking for None so
          # that subclasses will create their own __single objects
          if cls != type(cls.__single):
              cls.__single = object.__new__(cls, *args, **kwargs)
              __base = declarative_base()
  
          return cls.__single
  
      def __init__(self,name=None):
          self.name = name
  
      def get_base(self):
          return self.__base
  
  
      def set_base(self, value):
          self.__base = value
  </code></pre>
  
  <p>model/model.py</p>
  
  <pre><code>from utils.utils import getBase
  
  b = getBase("model")
  b.set_base(declarative_base())
  Base = b.get_base()
  
  class User(Base):
      __tablename__ = 'users'
  
      def __init__(self, name):
          self.screen_name = name
  
      name_id = Column(Integer, primary_key=True, autoincrement=True)
      screen_name = Column(BigInteger(), primary_key=True, nullable=False)
  </code></pre>
  
  <p><strong>EDIT @Lafaya</strong></p>
  
  <p>I changed <code>model/__init__.py</code> like that :</p>
  
  <pre><code>#!/usr/bin/python
  Base = declarative_base()
  </code></pre>
  
  <p>Then i changed <code>model/model.py</code> like that :</p>
  
  <pre><code>from model import Base
  
  class User(Base):
      etc...
  </code></pre>
  
  <p>Now i can't import Base from model.py (because it aleady import by <code>__init.py__</code>). But i need a reference to Base !</p>
  
  <pre><code>Traceback (most recent call last):
    File "../main/main.py", line 12, in &lt;module&gt;
      from model.model import User
    File "../model/model.py", line 3, in &lt;module&gt;
      from model import Base
  ImportError: cannot import name Base
  </code></pre>