Как получить вставленный или выбранный идентификатор строки в postgres, используя python - PullRequest
9 голосов
/ 19 сентября 2011

Мой запрос postgres:

query = """INSERT INTO statustable(value) SELECT '%s' 
                WHERE NOT EXISTS (SELECT id, value FROM statustable
                WHERE value = '%s') RETURNING id""" %  (status, status)
    cursor_postgres.execute(query)
    conn_postgres.commit()
    statusId = cursor_postgres.fetchone()[0]
    print "statusId" + str(statusId)

Мне нужно получить недавно вставленный идентификатор значения состояния, если он не существует, или выбрать его идентификатор, если он уже существует.RETURNING id полностью перекрыл этот запрос, поэтому мне пришлось удалить его, чтобы как минимум заставить работать выборочную вставку.

Любые подсказки, как получить статусId здесь?В другом случае я делаю Upsert. (Вставьте, если не существует, обновите в противном случае). Здесь снова, мне нужен вставленный или обновленный идентификатор строки.(Нет, я не использую хранимые процедуры, если это был ваш первый вопрос ...)

Заранее спасибо

1 Ответ

10 голосов
/ 19 сентября 2011

Не могу сказать, что полностью понимаю вашу мотивацию настаивать на одном запросе. Я думаю, что вам лучше всего иметь два простых запроса:

  1. SELECT id FROM statustable WHERE value = '%s'. Это дает вам идентификатор, если запись существует, и в этом случае пропустите шаг 2;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id. Это даст вам id вновь созданной записи.

Наконец, хотя я не проверял, является ли это проблемой, fetchone() в коммите выглядит немного подозрительно.

...