如何使用sqlalchemy编写一个帮助类

时间:2015-06-22 14:02:05

标签: python mysql google-app-engine sqlalchemy

我使用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个连接帽。

1 个答案:

答案 0 :(得分:1)

我发现答案是我的create_engine函数存在问题。