pygresql - вставить и вернуть серийный номер - PullRequest
1 голос
/ 17 сентября 2009

Я использую PyGreSQL для доступа к моей БД. В сценарии использования, над которым я сейчас работаю; Я пытаюсь вставить запись в таблицу и вернуть последний идентификатор строки ... или значение, которое БД создала для моего поля идентификатора:

create table job_runners (
    id           SERIAL PRIMARY KEY,
    hostname     varchar(100) not null,
    is_available boolean default FALSE
    );

sql = "insert into job_runners (hostname) values ('localhost')"

Когда я использовал db.insert (), который имел больше всего смысла, я получил «AttributeError». И когда я попробовал db.query (sql), я получил только OID.

Q: Как лучше использовать PyGreSQL для вставки записей и возврата значения поля ID без каких-либо дополнительных операций чтения или запросов?

Ответы [ 3 ]

1 голос
/ 17 сентября 2009
INSERT INTO job_runners
    (hostname,is_available) VALUES ('localhost',true)
    RETURNING id

Тем не менее, я понятия не имею о pygresql, но из того, что вы уже написали, я думаю, вы хотите использовать db.query().

0 голосов
/ 27 февраля 2010

Предполагается, что у вас есть объект курсора cur:

cur.execute("INSERT INTO job_runners (hostname) VALUES (%(hostname)s) RETURNING id",
            {'hostname': 'localhost'})
id = cur.fetchone()[0]

Это гарантирует, что PyGreSQL правильно экранирует входную строку, предотвращая внедрение SQL.

0 голосов
/ 17 сентября 2009

Документация в PyGreSQL гласит, что если вы вызовете dbconn.query () с оператором и оператором вставки / обновления, он вернет OID. Далее говорится что-то о списках OID, когда задействовано несколько строк.

Прежде всего; Я обнаружил, что функции OID не работают. Я полагаю, что знание номеров версий библиотек и инструментов помогло бы, однако я не пытался вернуть OID.

Наконец; добавив «возвращающий идентификатор», как предлагает @hacker, pygresql просто сделал правильную вещь и возвратил набор записей с идентификатором в полученный словарь (см. код ниже).

sql = "insert into job_runners (hostname) values ('localhost') returning id"
rv = dbconn.query(sql)
id = rv.dictresult()[0]['id']
...