Я пытаюсь создать функцию, используя модуль 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.