Python SQLite Вывод данных

Есть метод channels который должен возвращать все записи из БД

import sqlite3

class Database:

    def __init__(self, database):
        """Подключаемся к БД и сохраняем курсор соединения"""
        self.connection = sqlite3.connect(database)
        self.cursor = self.connection.cursor()

    def channels(self):
        with self.connection:
            for value in self.cursor.execute("SELECT * FROM `channels`").fetchall():
                return f"ID: {value[0]}\nTitle: {value[1]}\nURL: {value[2]}"

Но он возвращает лишь первое поле. Как мне вернуть все поля из таблицы channels


Ответы (1 шт):

Автор решения: gil9red

Варианты:

  1. Заполните в списке:

        def channels(self):
            items = []
            for value in self.cursor.execute("SELECT * FROM `channels`").fetchall():
                items.append(f"ID: {value[0]}\nTitle: {value[1]}\nURL: {value[2]}") 
            return items
    

    В одну строку:

        def channels(self):
            return [
                f"ID: {value[0]}\nTitle: {value[1]}\nURL: {value[2]}"
                for value in self.cursor.execute("SELECT * FROM `channels`").fetchall()
            ]
    
  2. Верните как генератор:

        def channels(self):
            for value in self.cursor.execute("SELECT * FROM `channels`").fetchall():
                yield f"ID: {value[0]}\nTitle: {value[1]}\nURL: {value[2]}"
    

    В одну строку:

        def channels(self):
            yield from (
                f"ID: {value[0]}\nTitle: {value[1]}\nURL: {value[2]}"
                for value in self.cursor.execute("SELECT * FROM `channels`").fetchall()
            )
    

Убрал with, т.к. там нет запросов, меняющих таблицы в базе данных


Кст, в текущей конструкции имеет смысл value указать возвращаемые значения, для повышения читаемости кода:

for id_, title, url in self.cursor.execute("SELECT * FROM `channels`").fetchall():
    f"ID: {id_}\nTitle: {title}\nURL: {url}"

Это если у вас в таблице channels 3 поля, если больше, тогда укажите их явно в выборке: SELECT id, title, url FROM channels, либо при распаковке использовать *args:

for id_, title, url, *_ in self.cursor.execute("SELECT * FROM `channels`").fetchall():
→ Ссылка