Модуль Sqlite3 Python не будет возвращать полные строки при использовании SELECT FROM WHERE - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать функцию, используя модуль Sqlite3 Python, который будет возвращать список строк на основе поиска по дате и времени с использованием команды SELECT.

Прямо сейчас, выбор всего (с 'select * from example_table') вернет целые строки правильно, но выбор на основе временных отметок (используя '''select %s from %s where %s > ? and %s < ?''' % (date_col_name, table_name, date_col_name, date_col_name)) вернет только временную отметку в кортеже (пропуская другой столбец).

Раньше я изо всех сил пытался сохранить тип данных datetime, но с помощью detect_types = sqlite3.PARSE_DECLTYPES он возвращает фактический объект datetime. Обычно я подозреваю, что это проблема, однако фактическая часть «фильтрации» команды SELECT работает. Верные объекты даты и времени возвращаются , им просто не хватает других данных в строке, к которой они принадлежали.

Соответствующий код:

sql_database_name = 'data_history.db'
date_col_name = 'Date'

class Database manager ...

    ... init ...

    def get_table_range(self, table_name, daterange=None):
        con = sqlite3.connect(self.database_name, detect_types=sqlite3.PARSE_DECLTYPES)
        c = con.cursor()

        if daterange is not None:
            startdate = daterange[0]
            enddate = daterange[1]
            sql = '''select %s from %s where %s > ? and %s < ?''' % (date_col_name, table_name, date_col_name, date_col_name)
            data = (startdate, enddate)
            c.execute(sql, data)
        else:
            sql = 'select * from %s' % table_name
            c.execute(sql)

        print("Fetchine one: ", c.fetchone())

        result = c.fetchall()

        c.close()
        con.close()

        return result


if __name__ == "__main__":
    test_db = "test.db"
    manager = DatabaseManager(database_name=test_db)

    selected = manager.get_table_range("test_table")
    print("Selected " + str(len(selected)) + "rows.")

    print("---")

    selected = manager.get_table_range("test_table", (datetime(2020, 3, 2, 23), datetime(2020, 3, 3)))
    print("Selected " + str(len(selected)) + "rows.")

Фактический вывод:

Fetchine one:  (datetime.datetime(2020, 3, 2, 19, 12, 57, 120184), 291.0)
Selected 97rows.
Fetchine one:  (datetime.datetime(2020, 3, 2, 23, 22, 15, 704786),) <<-- extra columns were not returned
Selected 25rows.

Желаемый вывод:

Fetchine one:  (datetime.datetime(2020, 3, 2, 19, 12, 57, 120184), 291.0)
Selected 97rows.
Fetchine one:  (datetime.datetime(2020, 3, 2, 23, 22, 15, 704786), XXX.X) 
Selected 25rows.

1 Ответ

1 голос
/ 03 марта 2020

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

 SELECT date_col_name FROM table_name WHERE date_col_name < ? AND date_col_name > ?;

Вы, вероятно, хотите сгенерировать код SELECT * FROM. . . или SELECT list, of, column, names FROM . . ..

И почему вы строите оператор SQL с заменой строк для имен столбцов и таблиц? Вы должны просто написать:

 sql = '''select date_col_name from table_name where date_col_name > ? and date_col_name < ?''' 

Имена столбцов не являются переменными (если только у вас нет какой-то странной настройки с несколькими одинаково структурированными таблицами с разными именами и разными именами столбцов, что может указывать на недостаток проекта ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...