2017-01-06 10 views
1

Может кто-нибудь объяснить мне, почему определенный test(). Commit() не работает как varcon.commit()? Все остальное, кажется, работает нормально. (С использованием бродячей VirtualBox из убунта-испытанный-32)Проблема с обязательствами python3 psycopg2 с использованием переменной функции vs для подключения

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

import psycopg2 

varcon = psycopg2.connect('dbname=tournament') 

def test(): 
    try: 
     psycopg2.connect("dbname=tournament") 
    except: 
     print("Connection to Tournament Database Failed") 
    else: 
     return psycopg2.connect('dbname=tournament') 


def writer(): 
    #db = psycopg2.connect('dbname=tournament') 
    c =varcon.cursor() 
    c.execute('select * from players') 
    data = c.fetchall() 
    c.execute("insert into players (name) values ('Joe Smith')") 
    varcon.commit() 
    varcon.close 
    print(data) 

def writer2(): 
    #db = psycopg2.connect('dbname=tournament') 
    c =test().cursor() 
    c.execute('select * from players') 
    data = c.fetchall() 
    c.execute("insert into players (name) values ('Joe Smith')") 
    test().commit() 
    test().close 
    print(data)  

writer2() #this seem not commited, but database registers the insert by observing the serial promotion 
#writer() # this works as expected 

ответ

0

, возможно, это происходит потому, что return утверждение в функциональном блоке (def) не равно задание как = Функции соединения psycopg2 возвращает объект соединения и это относится к conn или varcon

conn = psycopg2.connect("dbname=test user=postgres password=secret")

http://initd.org/psycopg/docs/module.html

функция test() также возвращает объект соединения psycopg2 но в writer2 он не присваивается переменной (место памяти), что означает, что нет никакой ссылки

это также объясняет, почему устанавливается соединение с базой данных (инициализируются в функция тестирования), но фиксации не работает (пунктирная ссылка)

(http://www.icu-project.org/docs/papers/cpp_report/the_anatomy_of_the_assignment_operator.html)

возможно попробовать

ami=test()

ami.commit()

установить ссылочный

+0

Благодарим Вас за очень полезный ответ! Можете ли вы изменить свою вторую ссылку на правильный адрес (http://www.icu-project.org), поскольку project.org - это что-то еще. Ваше предложение сработало. Кроме того, я нашел другой способ, но не уверен, что это хорошая практика: '' 'test(): try: psycopg2.connect ('dbname = tournament') за исключением: print (« Не удалось подключиться к базе данных турнира »,) еще: conn2 = psycopg2.connect ('имя_бд = турнир') conn2.autocommit = True возвращение conn2''' –

+0

в http://stackoverflow.com/questions/11735371/how-to-test-database -connectivity-in-python - это стандартный способ создания и тестирования подключения к базе данных в python.вы можете сделать это, как вы хотите ... –

+0

, пожалуйста, не повышайте, потому что я пытаюсь получить значок невоспетающего героя :) –

0

Каждый раз, когда вы называете psycopg2.connect() вы открываете новое подключение к базе данных.

Эффективно ваш код выполняет SQL в одном соединении, совершает другое, а затем закрывает третье соединение. Даже в вашей функции test() вы открываете два разных соединения.

Я использую следующий шаблон для доступа к PostgreSQL:

conn = psycopg2.connect(DSN) 

with conn: 
    with conn.cursor() as curs: 
     ... 
     curs.execute(SQL1) 

with conn: 
    with conn.cursor() as curs: 
     ... 
     curs.execute(SQL2) 

conn.close() 

with заявление обеспечивает открытия сделки и правильно совершенные вокруг SQL. Он также автоматически переводит транзакцию обратно, если ваш код внутри with вызывает исключение.

Ссылка: http://initd.org/psycopg/docs/usage.html#with-statement

+0

Благодарим за отзыв. Это хорошо знать. Я все еще новичок в python и PostgreSQL. Я использую программу Udacity для изучения, и интересно, что они не упомянули и не использовали этот метод. Интересно, почему ... Я также не понял, почему просто указывать var = psycopg2.connect (DSN) автоматически генерирует SQL-соединение? Это не похоже на вызов функции. Я бы предположил, что он активируется методом execute. Я не был уверен, стоит ли устанавливать глобальное значение «conn», а затем использовать его в различных определенных функциях sql-запросов. –

+0

'connect()' является функцией. PostgreSQL работает в отдельном процессе (или даже сервере), перед выполнением SQL вам необходимо установить соединение с ним. Затем вы можете повторно использовать одно и то же соединение несколько раз. Если вы сделаете этот путь, вы должны быть готовы восстановить потерянные соединения (они могут упасть через некоторое время). Программы реального мира получают соединения из пула соединений http://initd.org/psycopg/docs/pool.html, который заботится об управлении жизненным циклом соединения. –

+0

Спасибо! Мне предстоит пройти долгий путь ... –

 Смежные вопросы

  • Нет связанных вопросов^_^