programing

Python/postgres/psycopg2: 방금 삽입된 행의 ID 가져오기

oldcodes 2023. 5. 29. 11:08
반응형

Python/postgres/psycopg2: 방금 삽입된 행의 ID 가져오기

Python과 psycopg2를 사용하여 postgres와 인터페이스하고 있습니다.

행을 삽입할 때...

sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES ("
sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ");"
cursor.execute(sql_string)

방금 입력한 행의 ID를 어떻게 얻을 수 있습니까?시도 중:

hundred = cursor.fetchall() 

오류 반환, 사용 중RETURNING id:

sql_string = "INSERT INTO domes_hundred (name,name_slug,status) VALUES ("
sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ") RETURNING id;"
hundred = cursor.execute(sql_string)

단순 신고None.

업데이트: 업데이트도 마찬가지입니다.currval(이 명령을 postgres에 직접 사용하더라도):

sql_string = "SELECT currval(pg_get_serial_sequence('hundred', 'id'));"
hundred_id = cursor.execute(sql_string)

누가 조언해 줄 수 있습니까?

감사합니다!

cursor.execute("INSERT INTO .... RETURNING id")
id_of_new_row = cursor.fetchone()[0]

그리고 값이 포함된 SQL 문자열을 수동으로 작성하지 마십시오.값을 개별적으로 전달할 수 있으므로 이스케이프할 필요가 없고 SQL 주입이 불가능합니다.

sql_string = "INSERT INTO domes_hundred (name,name_slug,status) VALUES (%s,%s,%s) RETURNING id;"
cursor.execute(sql_string, (hundred_name, hundred_slug, status))
hundred = cursor.fetchone()[0]

자세한 내용은 싸이코펙 문서를 참조하십시오. http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

저도 비슷한 문제가 있어서 오게 되었는데, 아직 RETURNING ID 조항을 지원하지 않는 Postgres-XC를 사용하고 있습니다.이 경우 다음을 사용할 수 있습니다.

cursor.cursor.cursor……에 삽입)cursor.execute('LASTVAL() 선택')lastid = 커서입니다.마지막 발을 가져오다[마지막 발]

혹시라도 누군가에게 도움이 되었을 때를 대비해서요!

RETURN 조항 http://www.postgresql.org/docs/8.3/static/sql-insert.html 을 고려해 보십시오.

저에게는 도둑 마스터의 대답도 제이미 브라운의 대답도 통하지 않았습니다.저에게 효과가 있었던 것은 이 두 가지를 혼합한 것입니다. 저는 여기서 다른 사람에게 도움이 될 수 있도록 대답하고 싶습니다.

제가 해야 할 일은:

cursor.execute('SELECT LASTVAL()')
id_of_new_row = cursor.fetchone()[0]

진술서lastid = cursor.fetchone()['lastval']내겐 효과가 없었어, 심지어 그 후에도.cursor.execute('SELECT LASTVAL()')진술서id_of_new_row = cursor.fetchone()[0]혼자서도 효과가 없었습니다.

제가 뭔가를 놓친 것 같아요.

도둑 마스터의 접근 방식은 두 가지 모두에게 효과가 있었습니다.INSERT그리고.UPDATE명령을 실행합니다.

한다면cursor.fetchone()를 실행한 후 커서에서 호출됩니다.INSERT/UPDATE명령이지만 반환 값이 부족했습니다(RETURNING조항) 예외가 제기될 것입니다.ProgrammingError('no results to fetch'))



insert_query = """
    INSERT INTO hundred (id, name, name_slug, status)
        VALUES (DEFAULT, %(name)s, %(name_slug)s, %(status)s)
        RETURNING id;
"""

insert_query_values = { 
    "name": "",
    "name_slug": "",
    "status": ""
}

connection = psycopg2.connect(host="", port="", dbname="", user="", password="")

try:
    with connection:
        with connection.cursor() as cursor:
            cursor.execute(insert_query, insert_query_values)
            num_of_rows_affected = cursor.rowcount
            new_row_id = cursor.fetchone()

except psycopg2.ProgrammingError as ex:
    print("...", ex)
    raise ex

finally:
    connection.commit()
    connection.close()


언급URL : https://stackoverflow.com/questions/5247685/python-postgres-psycopg2-getting-id-of-row-just-inserted

반응형