当使用SELECTFROMWHERE时,Python的Sqlite3模块将不会返回整行

当使用SELECTFROMWHERE时,Python的Sqlite3模块将不会返回整行,python,sql,database,sqlite,datetime,Python,Sql,Database,Sqlite,Datetime,我试图使用Python的Sqlite3模块创建一个函数,该模块将使用SELECT命令返回基于日期时间戳搜索的行列表 现在,使用“select*from example_table”选择所有内容将正确返回整行,但基于时间戳选择时使用“select%s from%s where%s>?和%s

我试图使用Python的Sqlite3模块创建一个函数,该模块将使用SELECT命令返回基于日期时间戳搜索的行列表

现在,使用“select*from example_table”选择所有内容将正确返回整行,但基于时间戳选择时使用“select%s from%s where%s>?和%s<?“%date\u col\u name、table\u name、date\u col\u name、date\u col\u name将只返回缺少另一列的元组中的时间戳

以前,我很难保留datetime数据类型,但是使用detect_types=sqlite3.PARSE_DECLTYPES,它会返回一个实际的datetime对象。通常我会怀疑这是个问题,但是SELECT命令的实际过滤部分正在工作。返回的是正确的datetime对象,它们只是缺少所属行中的其他数据

相关代码:

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.")


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

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

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

噢,伙计,您正在使用字符串格式来生成查询。这对SQL注入是开放的。您正在尝试参数化一个没有占位符的查询,因为您将占位符用于字符串格式,而SQLite使用?。我建议你退一步,因为这里有几个misconceptions@roganjosh是的!谢天谢地,我有很多东西要学,这永远不会暴露在外部网络中,但一旦我有了一个工作实例,我最终会为后代重构它。你的最后一句话正是我设置的。在一个小型网络中,许多小型微控制器ESP8266从给定空间的各个点发送温度数据。每个传感器都有一个表,每个表都有一个datetime+temp列,每个表都以每个传感器命名。这些传感器的测量时间间隔不同,因此我认为不能将它们包含在同一张表中。有没有更好的方法让你知道呢?我被教导名称/常量不应该硬编码。如果我以后需要更改它们,我只需要编辑一行。SQL不是这样吗?谢谢你的建议!这正是我为什么要问的,我对SQL/数据库非常陌生。如果我对应用程序的设计一无所知,那么我就太冒昧了。这就是说:-,我的强烈倾向是创建表测量传感器ID文本,测量日期时间,温度真实值。如果每个传感器的间隔对您很重要,例如,如果同一个应用程序实际控制传感器,我会有一个额外的表格创建表格传感器传感器ID文本IntervalinsSeconds INT。我想我还是会有这个表格,如果我想每隔几秒钟提取一个特定的数据区域来绘制图表,这种方法会不会大大降低查找时间?或者,无可否认,这是我下一个要学习的主题,因为数据库很大程度上解决了这个问题吗?我创建单独表格的最初动机是,在获取时间范围内的传感器历史记录时,我可以减少以后要筛选的数据量。索引在很大程度上解决了这个问题。正确设计数据库。如果您以后遇到性能问题,例如,当您达到1亿个度量值时,您可以考虑对数据进行切分以提高性能—只有当这种情况发生时,您才能获得有关性能问题所在的实际信息。
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 > ?;
 sql = '''select date_col_name from table_name where date_col_name > ? and date_col_name < ?'''