您可以使用rowcount 轻松处理它。这就是psycopg 文档中提到的rowcount,
此只读属性指定最后一次执行*() 产生的行数(对于 SELECT 等 DQL 语句)或受影响(对于 UPDATE 或 INSERT 等 DML 语句)。
如果没有对游标执行execute*(),则该属性为-1,如果接口无法确定,则为最后一次操作的行数。
所以下面的例子会让你更好地理解如何使用rowcount。
示例 - 1
>> # if your SELECT query doesn't have any values you'll get 0 as the output
>>> query_1 = 'SELECT * FROM some_table LIMIT 0;'
>>> cursor.execute(query)
>>> cursor.rowcount
0
示例 - 2
>>> query_2 = 'SELECT * FROM some_table LIMIT 1;'
>>> cursor.execute(query)
>>> cursor.rowcount
1
示例 - 3
>>> # no LIMIT in the query, so you'll get the whole row count
>>> query_3 = 'SELECT * FROM some_table;'
>>> cursor.execute(query)
>>> cursor.rowcount
14000
示例 - 4
>>> # this query won't return anything, so you'll get -1 as the rowcount
>>> query_4 = 'CREATE TABLE new_table AS SELECT * FROM old_table;'
>>> cursor.execute(query)
>>> cursor.rowcount
-1
所以你可以像下面这样修改你的函数,
def track_exists(self, track_id):
cur = self.conn.cursor()
cur.execute("SELECT fma_track_id FROM tracks WHERE fma_track_id = %s", (track_id,))
# if cur.rowcount > 0:
# return True
# else:
# return False
return cur.rowcount > 0 # more Pythonic way
请注意:如果您执行UPDATE 查询,您将获得rowcount 的更新行数。所以基本上rowcount 将显示受您的查询影响的行数。 CREATE 查询不会影响任何行,这就是为什么您会为 rowcount 获得 -1。