Python 的 Sqlite3 模块在使用时不会返回整行 从哪里选择



我正试图使用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)(将只返回元组中的时间戳(缺少另一列(。

以前,我很难保留日期时间数据类型,但当detect_types=sqlite3.PARSE_DECLTYPES时,它会返回一个实际的日期时间对象。通常我会怀疑这是问题所在,但是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.

它正是返回您所要求的内容,因为您的查询转换为:

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 < ?''' 

列名不是变量(除非您有一些奇怪的设置,其中有多个结构相同的表,具有不同的名称和不同的列名,这可能表明存在设计缺陷(。

最新更新