Python psycopg2检查行存在

2024-10-06 12:09:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在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__'

Tags: inselfidreturnifdefexistsline
3条回答

使用^{}将允许Postgresql在中的第一次出现时停止搜索,而不是在用完之前进行搜索:

exists_query = '''
    select exists (
        select 1
        from tracks
        where fma_track_id = %s
    )'''
cursor.execute (exists_query, (track_id,))
return cursor.fetchone()[0]

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

不要使用fetchall()(它返回一个永远不大于0的列表),使用fetchone()

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,))
    return cur.fetchone() is not None

fetchone()如果没有要获取的内容,则返回None,并且对is not None进行测试可以提供一个方便的布尔值,以便直接返回。

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

相关问题 更多 >