2012-01-19 21 views
5

すべてが1つのファイル内にある場合は、通常SQLAlchemyを実行できます。私は今、私のモデルを別のファイルに入れたいと思っています。Pythonでシングルトンを使用したDeclarative_Base(SQLAlchemy)の共有

しかし、私はベースを共有する方法が見つからないため、これは機能しません。私はSingletonで試してみましたが、model.pyではNullであり、スキーマは決してデータベースに作成されません。

これを修正するにはどうすればよいですか?

マイファイル(簡易版):

 - /main/__init__.py 
    - /main/main.py 
    - /utils/__init__.py 
    - /utils/utils.py 
    - /model/__init__.py 
    - /model/model.py 

メイン/ main.py:

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

utilsの/ utils.py

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 

モデル/ model.py

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) 

EDIT @Lafaya

私はそのようmodel/__init__.pyを変更:

#!/usr/bin/python 
Base = declarative_base() 

は、その後私はそのようなmodel/model.pyを変更:

from model import Base 

class User(Base): 
    etc... 

今私はmodel.pyからベースをインポートすることはできません(それは__init.py__によってaleady輸入するので)。しかし、私はベースへの参照が必要です!

Traceback (most recent call last): 
    File "../main/main.py", line 12, in <module> 
    from model.model import User 
    File "../model/model.py", line 3, in <module> 
    from model import Base 
ImportError: cannot import name Base 

答えて

4

は、モデルパッケージの__init__.pyBaseを書きます。その後、それをインポートして使用することができます。

Basemodel/__init__.pyに入れてください。

+0

私の回答in post編集 – Yohann

+0

Ok、私は最終的にモデルを__init__.pyでpuします – Yohann

関連する問題