Почему PostdgreSQL постоянно выдает ошибку AttributeError: 'NoneType' object has no attribute 'fetchall'?
Данные не возвращаются в вашу переменную. Они лежат в курсоре.

def client_exists(self, user_id):
        """Проверяем есть ли клиент уже в базе данных"""
        self.cursor.execute("""SELECT * FROM clients WHERE user_id = %s""", (user_id,))
        return bool(len(self.cursor.fetchall()))

И можно сделать немного вот так (если не путаю):

def client_exists(self, user_id):
        """Проверяем есть ли клиент уже в базе данных"""
        self.cursor.execute("""SELECT * FROM clients WHERE user_id = %s""", (user_id,))
        return self.cursor.fetchone() is not None
Я полагаю, есть два способа сигнализации о пустом ответе, и разные движки используют разные подходы. 
Либо БД может вернуть объект-курсор, который не содержит ни одной строки.
Либо БД может вернуть None.

Для понятности такая аналогия: пусть нам возвращают список. Если нам всегда возвращают список, то можем писать код так:
for line in db.query("..."):
    do_something(line)
Сработает даже еслди в ответе нет ни одной строки, т.е. на пустом списке.
А вот если нам при пустом ответе возвращают None, то код выше вылетит с ошибкой NoneType is not iterable, и надо будет переписать так:
result = db.query("...")
if result is not None:
    for line in result:
        do_something(line)