Eu tenho uma consulta de exclusão bastante simples em um banco de dados PostgreSQL com o qual estou interagindo via psycopg2
.
Tome o seguinte exemplo mínimo:
def testDelete():
db = DbInterface()
cur = db.conn.cursor()
cur.execute("DELETE FROM munamelist WHERE name='something'")
print("Results = ", cur.fetchall())
Basicamente, a documentação do PostgreSQL paraDELETE
estados:
Após a conclusão bem-sucedida, um comando DELETE retorna uma tag de comando no formato
DELETE count
A contagem é o número de linhas excluídas. Observe que o número pode ser menor que o número de linhas que corresponderam à condição quando as exclusões foram suprimidas por um gatilho BEFORE DELETE. Se count for 0, nenhuma linha foi excluída pela consulta (isso não é considerado um erro).
No entanto, psycopg2
gera um erro ao tentar buscar os resultados da consulta:
Traceback (most recent call last):
File "autoOrganize.py", line 370, in <module>
parseCommandLine()
File "autoOrganize.py", line 363, in parseCommandLine
testDelete()
File "autoOrganize.py", line 247, in testDelete
print("Results = ", cur.fetchall())
psycopg2.ProgrammingError: no results to fetch
Não importa se o item existe ou não, você não pode buscar os resultados da consulta. Não psycopg2
retorna "tags de comando" para SQL?
Caso contrário, como posso recuperar o número de linhas alteradas que seriam retornadas na interface do console? Não importa, aparentemente cursor.rowcount
é o número de linhas modificadas na última instrução DML
/ DQL
.
DELETE
withoutRETURNING
não retorna um conjunto de resultados. Portanto, você não pode usarfetch...
chamadas com ele, comocursor.fetchall()
.A contagem de linha afetada é armazenada
cursor.rowcount
para DML.Acho que o que você queria era:
Quando eu uso
INSERT
, isso imprime corretamenteINSERT 0 3
etc.