2016-12-13 3 views
0

У меня есть приложение Flask, которое подключается к удаленной базе данных PostgreSQL (на Amazon RDS). Вот пример того, как подключиться к базе данных:Flask auto-reconnect PostgreSQL

import psycopg2 
import sys 

from flask import (Flask, render_template, request, redirect, url_for) 


# Start a Flask app 
app = Flask(__name__, static_url_path='') 

# Connect to RDS database 
con = psycopg2.connect(**params) 
cur = con.cursor() 

@app.route('/', methods=['GET']) 
def index(): 
    global cur 

    args = {} 
    try: 
     cur.execute("SELECT * FROM x_table")   
    except psycopg2.InterfaceError: 
     con = psycopg2.connect(**params) 
     cur = con.cursor() 

    # some additional code here ... 
    return render_template('index.html', args=args) 


if __name__ == "__main__": 
    app.run(debug=True, host="0.0.0.0") 

У меня есть проблема в том, что после нескольких минут бездействия, соединение закрывается, и я должен перезапустить приложение. Я добавил элемент управления исключения, чтобы поймать эту ошибку и снова подключиться, но я все еще получаю ошибку, что курсор уже закрыт.

Каков правильный способ автоматического повторного подключения?

+0

Вы уже обработали ошибку. Вам просто нужно скопировать строку 'execute()' в конец блока 'except'. И из причины хранить и обрабатывать результаты запроса. –

ответ

0

Вам необходимо создать курсор для каждый запрос. Вы можете использовать курсор для многих запросов, если они запускаются вместе. Но каждый раз нагнетайте курсор с новым курсором:

con = psycopg2.connect(**params) 

def run_query(query): 
    with closing(con.cursor()) as cur: 
     try: 
      cur.execute(query) 
      con.commit() 
      if cur.rowcount > 0: 
       return cur.fetchall() 
      else: 
       return cur.lastrowid 
     except: 
      con.rollback() 
run_query(SELECT * FROM x_table) 
Смежные вопросы