zoukankan      html  css  js  c++  java
  • 基于Flask的Web应用部署到SAE上遇到的问题

    我的应用底层数据库用的是MySQL,利用Flask-SQLALchemy实现接口操作。我遇到的问题是:

    在我把代码部署到SAE上后,当数据向数据库insert的时候总是出现“2006,MySQL has gone away”的问题。

    查了官方文档和Google了很多,首先是用如下方法去做的:

    1、SQLAlchemy_POOL_SIZE = 10

    2、每次操作之后关闭数据库

    def init_after_handlers(app):
        @app.teardown_appcontext
        def teardown_request(exception=None):
            if hasattr(g, 'db'):
                g.db.close()
            #db2 = getattr(g, 'db2', None)
            if db is not None:
                db.session.remove()

    但是上面的步骤对我却不起作用,真的是不应该啊!!!!!

    后来又查了一下,说可以用ping,所以我此时就抛弃了利用SQLALchemy操作该部分数据,而改为直接使用MySQLdb。利用ping的方法就是不断的进行新连接。

     def _connect(self,dbname):
            tar = self.config[dbname]
            self.con = MySQLdb.connect(host=tar['host'],
                                       user=tar['user'],
                                       port=tar['port'],
                                       passwd=tar['passwd'],
                                       charset=tar['charset'],
                                       db=tar['db'])
            self.con.ping(True)
            self.cursor = self.con.cursor(cursorclass=MySQLdb.cursors.DictCursor)
    

    在进行插入时:

    def insert_by_dic(self,table,data):
            keys = data.keys()
            values = []
            keystr = ','.join('`' + x + '`' for x in keys)
            for key in keys:
                values.append(data[key])
            valstr = ','.join( "'" + x + "'" if isinstance(x,unicode) 
                               else "'" + str(x).decode('utf8') +"'" for x in values )   
            sql = "INSERT INTO  %s (%s) VALUES (%s) " % (table,keystr,valstr)
            self.cursor.execute(sql)
            self.con.commit()
    
    
     def insert_list_dic(self,data,table):
            for item in data:
                try:
                    self.insert_by_dic(table, item)
                except MySQLdb.OperationalError:
                    self._connect(dbname)
                    self.insert_by_dic(table, item)
                    continue
                except MySQLdb.IntegrityError,e:
                    print str(e)
                    continue
    

      

    进行如上代码后,已经完全解决了2006的问题。

    其实现在又遇到了一个问题,那就是我之前的分页是在后台实现的,即在model中利用pagnite实现的,但利用MySQLdb之后,实现不了,我还得学会在前端将数据进行分页。

    未完待续..........................

  • 相关阅读:
    TS 3.1
    TS 3.1
    MDN 教程
    MDN 教程
    MDN 教程
    MDN 教程
    MDN 教程
    MDN 教程
    cookie会话技术
    数据库语法-1
  • 原文地址:https://www.cnblogs.com/hai-persist/p/4988667.html
Copyright © 2011-2022 走看看