Метод fetchone() возвращает NoneType

Рейтинг: -1Ответов: 2Опубликовано: 22.05.2023

В базе данных указан Data type - text. По логике вещей он должен возвращать string, но почему-то возвращает NoneType и выскакивает соответствующая ошибка "expected string or bytes-like object".

import psycopg2
from auth_data import host, password, db_name, user
import re

connection = psycopg2.connect(host=host, user=user, password=password, database=db_name)
pattern = r"'(.*?)'"

try:
    cursor = connection.cursor()

    with connection.cursor() as cursor:
        cursor.execute(f"SELECT game FROM game_users WHERE id_tg = 5916961134;")
        connection.commit()
        string = cursor.fetchone()
        print(re.findall(pattern, string))
except Exception as _ex:
    print(f'[INFO] Error while working with PostgreSQL {_ex}')
finally:
    if connection:
        cursor.close()
        connection.close()
        print(f'[INFO] PostgreSQL connection closed')

Жду ваших решений!

P.S. база данных - PostgreSQL, если это играет какую-то роль.

P.S.S Пишу это дополнения, как доказательство тому, что в результате есть строка.

import psycopg2
from auth_data import host, password, db_name, user

connection = psycopg2.connect(host=host, user=user, password=password, database=db_name)

try:
    cursor = connection.cursor()

    with connection.cursor() as cursor:
        cursor.execute(f"SELECT game FROM game_users WHERE id_tg = 5916961134;")
        connection.commit()
        print(f'[INFO] String is {cursor.fetchone()}')
except Exception as _ex:
    print(f'[INFO] Error while working with PostgreSQL {_ex}')
finally:
    if connection:
        cursor.close()
        connection.close()
        print(f'[INFO] PostgreSQL connection closed')

Вывод:

[INFO] String is ('Minecraft',)
[INFO] PostgreSQL connection closed

Ответы

▲ 0Принят

Я решил свою проблему таким образом, даже не используя регулярные выражения. всем спасибо за помощь!

import psycopg2
from auth_data import host, password, db_name, user

connection = psycopg2.connect(host=host, user=user, password=password, database=db_name)

try:
    with connection.cursor() as cursor:
        cursor.execute("SELECT game FROM game_users WHERE id_tg = 5916961134;")
        connection.commit()
        result = cursor.fetchone()
        string = result[0]
        print(string.strip("('')"))
except Exception as _ex:
    print(f'[INFO] Error while working with PostgreSQL: {_ex}')
finally:
    if connection:
        connection.close()
        print(f'[INFO] PostgreSQL connection closed')
▲ 2

Метод fetchone возвращает кортеж (tuple) или None, если нет данных. Вы пытаетесь применить регулярное выражение re.findall к кортежу.

Вам нужно получить первый элемент из кортежа (строку), а затем применить регулярное выражение к этой строке

import psycopg2
from auth_data import host, password, db_name, user
import re

connection = psycopg2.connect(host=host, user=user, password=password, database=db_name)
pattern = r"'(.*?)'"

try:
    with connection.cursor() as cursor:
        cursor.execute("SELECT game FROM game_users WHERE id_tg = 5916961134;")
        connection.commit()
        result = cursor.fetchone()
        if result:
            string = result[0]
            print(re.findall(pattern, string[0]))
        else:
            print("No data found.")
except Exception as _ex:
    print(f'[INFO] Error while working with PostgreSQL: {_ex}')
finally:
    if connection:
        connection.close()
        print(f'[INFO] PostgreSQL connection closed')