Python psycopg2检查行存在

Python psycopg2检查行存在,python,sql,postgresql,psycopg2,Python,Sql,Postgresql,Psycopg2,在Python psycopg2中,如何检查行是否存在 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.fetchall() > 0: return true else: ret

在Python psycopg2中,如何检查行是否存在

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.fetchall() > 0:
        return true
    else:
        return false
目前我正在

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mumu.py", line 38, in track_exists
if cur.fetchall() > 0:
TypeError: 'NoneType' object has no attribute '__getitem__'
不要使用fetchall返回列表,该列表永远不会“大于0”,请使用fetchone:

如果没有要获取的内容,fetchone将返回None,而针对is not None进行测试将为您提供一个方便的布尔值以直接返回

使用将允许Postgresql在中第一次出现时停止搜索,而不是在耗尽之前停止搜索:

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 len(cur.fetchall()) > 0:
        return true
    else:
        return false
exists_query = '''
    select exists (
        select 1
        from tracks
        where fma_track_id = %s
    )'''
cursor.execute (exists_query, (track_id,))
return cursor.fetchone()[0]

另一个优点是,它总是返回一个包含布尔值的单行,可以直接使用,而无需进一步解释。

您可以使用。这就是文件中提到的

此只读属性指定上次execute*为SELECT等DQL语句生成的行数,或为UPDATE或INSERT等DML语句影响的行数

如果没有对游标执行任何操作,则属性为-1;如果接口无法确定,则最后一个操作的行计数为-1

因此,下面的示例将使您更好地了解如何使用

示例-1

>>如果您的SELECT查询没有任何值,您将得到0作为输出 >>>查询_1='从某些_表中选择*限制0;' >>>cursor.executequery >>>cursor.rowcount 0 例2

>>>query_2='从某些_表中选择*限制1;' >>>cursor.executequery >>>cursor.rowcount 1. 示例-3

>>>查询中没有限制,因此您将获得整行计数 >>>query_3='SELECT*FROM some_table;' >>>cursor.executequery >>>cursor.rowcount 14000 示例-4

>>>此查询不会返回任何内容,因此您将得到-1作为行数 >>>query_4='CREATE TABLE new_TABLE AS SELECT*FROM old_TABLE;' >>>cursor.executequery >>>cursor.rowcount -1 所以你可以像下面那样修改你的函数

def track_existsself,track_id: cur=self.conn.cursor cur.executes从fma_track_id=%s,track_id, 如果cur.rowcount>0: 返回真值 其他: 返回错误 返回cur.rowcount>0更多Python方式
请注意:如果您执行更新查询,您将获得更新的行数。因此,基本上会显示受查询影响的行数。CREATE query不会影响任何一行,所以这就是为什么在使用fetchone时得到-1。

我仍然得到return cur.fetchone不是None TypeError:“NoneType”对象没有属性“\uuuu getitem\uuuuuuuuuuuuuuu”,然后在您的问题中发布完整的回溯,这个错误毫无意义,听起来也不像是在这里抛出的。这些代码都没有使用项访问。我正在从myModule导入数据库重新加载,但没有正确地重新加载。现在工作:很好。请注意,我对fetchall的评论仍然有效。您是否也应该在此处引用%s?我读到Postgres会自动将所有不带引号的用户名转换成小写。虽然你修复了OP的代码,但3.5年前的另一个答案效率更高。因此,这不太可能对未来的读者有多大帮助。
exists_query = '''
    select exists (
        select 1
        from tracks
        where fma_track_id = %s
    )'''
cursor.execute (exists_query, (track_id,))
return cursor.fetchone()[0]