我使用google-appengine作为我的生产环境,它与mysql服务器保持12个mysqldb + mysql://连接,超过12个连接显示套接字打开失败。
我想要的是,写一个简单的crud包装器。 目前,
class CRUDHelper(object):
_instance = None
_engine = None
_session = None
def __new__(cls, *args, **kwargs):
if cls._instance:
print "Reusing instance"
return cls._instance
cls._instance = super(CRUDHelper, cls).__new__(cls, *args, **kwargs)
return cls._instance
def __init__(self):
if not CRUDHelper._engine:
CRUDHelper._engine = create_engine("mysqldb+mysql://test@/test?unix_socket=/cloudsql/appid:appname")
CRUDHelper._engine.echo = True
self.engine = CRUDHelper._engine
if not CRUDHelper._session:
CRUDHelper._session = scoped_session(sessionmaker(autoflush = True, bind=self.engine))
self.sessionn = CRUDHelper._session
Base.metadata.create_all(bind= self.engine)
def get(self, model, id):
session = self.session()
# Developer is an sqlalchemy model
dev = session.query(model).filter_by(id=id).one()
session.close()
return dev
def save(self, object, merge=False):
self.session.flush()
if not merge:
self.session.add(object)
else:
self.session.merge(object)
self.session.commit()
这是我的crud包装器。上面的代码是可扩展的,并且不会超出我想要的12个连接。
但问题是。
考虑id = 1的开发者实体名称=" bob"并且年龄= 23
crud = CRUDHelper()
dev = curd.get(Developer, 1)
print dev.age
dev.age += 1
crud.save(dev, merge=True)
假设我运行上面两段代码。预计将是23和24,但我只得到23和23。
所以任何人都可以告诉我这里做错了什么,或者给我一个更好的包装,有12个连接帽。
答案 0 :(得分:1)
我发现答案是我的create_engine函数存在问题。