2015-07-16 2 views
0

Я пытаюсь написать небольшой веб-сервис в Python. Я использую Heroku и их службу postgre-DB (бесплатно).Psycopg2 Postgre Connection retries

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

Часть вызова функции search_image:

def handle_send(update): 
    link = databasecon.search_image(update["message"]["text"], update) 

connect_to_database функция:

def connect_to_db(): 
    global __is_connected 
    if "DATABASE_URL" not in os.environ or __is_connected == True: 
     print("Environment-variable missing or already connected") 
    else: 
     urllib.parse.uses_netloc.append("postgres") 
     url = urllib.parse.urlparse(os.environ["DATABASE_URL"]) 
     con = psycopg2.connect(
      database=url.path[1:], 
      user=url.username, 
      password=url.password, 
      host=url.hostname, 
      port=url.port 
      ) 
     if con != None: 
      __is_connected = True 
    return con 

search_image функция:

def search_image(image_name, update): 
    db_con = connect_to_db() 
    cur = db_con.cursor() 
    query = """select link from mm_image where id=%s""" 
    cur.execute(query, (image_name)) 
    result = cur.fetchone() 
    if result != None: 
     image_link = str(result[0]) 
     disconnect_from_db(db_con) 
     return image_link 
    else: 
     disconnect_from_db(db_con) 
     return "Not found" 

Это вот как бревно выглядит, как в ближайшее время, при вызове функции handle_send: http://i.stack.imgur.com/pTZcF.png

В чем проблема?
Это моя первая правильная программа, написанная на Python, так что если это явная ошибка, я извиняюсь: S

ответ

0

Ok Я нашел ошибку. Функция execute НЕОБХОДИМА кортеж в качестве второго аргумента.

Из официальной документации использования:

Для позиционных переменных связывания, то второй аргумент всегда должен быть последовательностью, даже если он содержит одну переменную. И помните, что Python требует запятую, чтобы создать единый элемент tuple

0

Линия:

if "DATABASE_URL" not in os.environ or __is_connected == True: 
     print("Environment-variable missing or already connected") 
    else: 

... будет проверять, если DATABASE_URL не существует и затем проверяет __is_connected == True (который равен true после первого соединения).

Следовательно, при каждой последующей проверке ваша программа будет print("Environment-variable missing or already connected"), потому что каждый пробег оценивается if __is_connected == True.

Вы должны рассмотреть разбив его немного дальше:

def connect_to_db(): 
    global __is_connected 
    if __is_connected == True: 
     break; 
    elif "DATABASE_URL" not in os.environ: 
     print("DATABASE_URL not set") 
    else: 
     print(" 
     urllib.parse.uses_netloc.append("postgres") 
     url = urllib.parse.urlparse(os.environ["DATABASE_URL"]) 
     con = psycopg2.connect 
     // etc. 
+0

Hey lookl ike Я не описал свою проблему должным образом. Проблема заключается в том, что когда handle_send вызывается и пытается подключиться к БД, каким-то образом он начинает цикл по соединению, и он пытается подключиться к БД несколько раз, пока я не остановлю программу. Это выглядит следующим образом: http://puu.sh/j1fdq/7d0fe34e34.PNG (Как только я пишу «heytest.gif» -Message, программа вызывает функцию handle_send.) – NiV