【发布时间】:2015-06-22 14:02:04
【问题描述】:
我使用 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()
这是我的粗包装。上面的代码是可扩展的,并且不会超出我想要的 12 个连接。
但问题是。
考虑一个 id = 1 的开发者实体 name= "bob" 并且年龄 = 23
crud = CRUDHelper()
dev = curd.get(Developer, 1)
print dev.age
dev.age += 1
crud.save(dev, merge=True)
假设我运行上面的 sn-p 代码两次。预期是 23 和 24,但我只得到 23 和 23。
所以任何人都可以建议我这里做错了什么,或者给我一个更好的包装器,有 12 个连接上限。
【问题讨论】:
标签: python mysql google-app-engine sqlalchemy