python成员方法共享吗_在Python中与Singleton共享Declarative_Base(SQLAlchemy)

当一切都在一个文件中时,我可以正常运行sqlAlchemy.我现在想把我的模型放到另一个文件中.

但是,这不起作用,因为我找不到共享基础的方法.我尝试使用Singleton但它在model.py中是Null,并且从不在数据库中创建模式.

我该怎么做才能解决这个问题?

我的文件(简化版):

- /main/__init__.py

- /main/main.py

- /utils/__init__.py

- /utils/utils.py

- /model/__init__.py

- /model/model.py

main / 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,**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(),nullable=False)

编辑@Lafaya

我更改了model / __ init__.py:

#!/usr/bin/python

Base = declarative_base()

然后我改变了model / model.py:

from model import Base

class User(Base):

etc...

现在我无法从model.py导入Base(因为它由__init.py__导入).但我需要参考Base!

Traceback (most recent call last):

File "../main/main.py",line 12,in

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值