2013-08-05 3 views
21

Я использую следующее, чтобы попытаться вставить запись в таблицу базы данных postgresql, но она не работает. Я не получаю никаких ошибок, но в таблице нет записей. Мне нужна фиксация или что-то еще? Я использую базу данных postgresql, которая была установлена ​​с установкой djangostack Bitnami.Python psycopg2 не вставляется в таблицу postgresql

import psycopg2 

try: 
    conn = psycopg2.connect("dbname='djangostack' user='bitnami' host='localhost' password='password'") 
except: 
    print "Cannot connect to db" 

cur = conn.cursor() 

try: 
    cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""") 
except: 
    print "Cannot insert" 
+3

Предупреждение: 'except:' clauses, не обнаруживающие конкретного исключения, вообще не помогают в отладке кода. – bernie

ответ

44

Если не хотите, чтобы совершить каждую запись в базу данных, вы можете добавить следующую строку:

conn.autocommit = True 

Так что ваши Результирующий код будет:

import psycopg2 

try: 
    conn = psycopg2.connect("dbname='djangostack' user='bitnami' host='localhost' password='password'") 
    conn.autocommit = True 
except: 
    print "Cannot connect to db" 

cur = conn.cursor() 

try: 
    cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""") 
except: 
    print "Cannot insert" 
+0

Привет, хорошо, знаете ли, что произойдет, если у вас нет автообмена, установленного в True, и вы никогда не совершаете? Кажется, что последовательность таблицы увеличивается, но где строки? –

+0

@ DanielBaughman: Это потому, что последовательности увеличиваются, даже если вы не совершаете; см., например, [Последовательности, не затронутые транзакциями? ] (https://stackoverflow.com/questions/2095917/sequences-not-affected-by-transactions) – user1071847

2

psycopg2 является Python DB API-совместимый, поэтому функция автоматической фиксации по умолчанию отключена. Вы должны позвонить conn.commit для фиксации любой ожидающей транзакции базы данных. Как соединения (и курсоры) являются менеджерами контекста, вы можете просто использовать with заявление автоматически совершить/откатить транзакцию на выходе из контекста:

with conn, conn.cursor() as cur: # start a transaction and create a cursor 
    cur.execute(sql) 

Из docs:

Когда соединение выходов блок with, если исключение не было , поднятое блоком, транзакция совершена. В случае исключения транзакция откатывается.

Когда курсор выходит из блока with, он закрывается, освобождая любой связанный с ним ресурс . Состояние транзакции не влияет.

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