【发布时间】:2020-06-16 04:35:10
【问题描述】:
我正在尝试使用 Python 的 Sqlite3 模块创建一个函数,该模块将根据使用 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.
【问题讨论】:
-
哦,伙计,您正在使用字符串格式来构建查询。这对 SQL 注入开放
-
您正在尝试参数化没有占位符的查询,因为您将它们用于字符串格式化(而 SQLite 使用
?)。我建议你退后一步,因为有几个误解 -
@roganjosh,是的!我有很多学习要做,谢天谢地,这永远不会暴露给外部网络,但我最终会为后代重构它(一旦我有一个工作示例)
标签: python sql database sqlite datetime