使用 SQL 在 QT 中创建包含大量列的 table 的最简单方法?

Easiest way to create a table with lots of columns in QT with SQL?

我将使用这些列名称创建一个 table。

QStringList column_names = {"ID","Day","Hour","Minute","Second","Millisecond","ADC0","ADC1","ADC2","ADC3","ADC4","ADC5","ADC6","ADC7","ADC8","ADC9","ADC10","ADC11","DADC0","DADC1","DADC2","DADC3","DADC4","I0","I1","I2","I3","I4","I5","I6","I7","E0","E1","IC0","IC1","DAC0","DAC1","DAC2","PWM0","PWM1","PWM2","PWM3","PWM4","PWM5","PWM6","PWM7"};

有不同类型的数据类型,有些是浮点数。 但是,如果我要在 QT 中使用 QSqlQuery class,这会使代码变得非常混乱。

问题:

我是否需要使用 QSqlQuery class 来创建带有列的 table,或者我可以在 QT 中使用 QSqlQueryModel class 代替?

我的目标是用上面的 column_names 创建一个 table。

关于QSqlQueryModel:

查看一些在线 Qt 文档后,似乎使用 QSqlQueryModel 创建 table 的唯一方法需要您子 class QSqlQueryModelhttps://doc.qt.io/qt-5/qsqlquerymodel.html#details

否则,QSqlQueryModel的接口根据文档中的几个位置不执行写入操作,包括: https://doc.qt.io/qt-5/qsqlquerymodel.html#setHeaderData

根据线程中的一些人描述的行为的另一个例子,以及解决方案的简要描述: https://forum.qt.io/topic/35287/qsqltablemodel-read-only

因此,现有的使用QSqlQueryModel as-is的方法涉及将视图与object实例相关联,通过QSqlQueryModel实例查询现有数据库,并显示GUI 中的查询结果。

关于改用 QSqlQuery:

QSqlQuery 的实施允许向 SQL 数据库发布一般查询,包括结构不良的查询、只读查询以及写入查询。虽然一个table的初始化过程有一个很大的数 您列出的列数似乎很烦人,这主要取决于您的数据库用例 object.

'Set and forget' 用例:

此用例的假设包括:偶尔或异常大量的数据被添加,主要是从数据库中读取。

使用 QSqlQuery 界面执行您对数据库的写入,以及 QSqlQueryModel GUI(如果有)。这个想法是你将很少调用 QSqlQuery 接口,当查询完成时,你可以简单地 以锁步方式刷新QSqlQueryModel object及其对应的视图。虽然这个解决方案看起来不如使用一个或另一个那么紧密,但它会更容易线程化这种设置,因为那样你 可以将 QSqlQuery object 包裹在命令 class 中,可用于您自己的应用程序的其余部分。

此外,QSqlQueryModel 实例将提供视图 object,无论如何,使用增量行,无需使用 QSqlQuery.

手动滚动

'Legacy dataset handling' 用例:

此用例的假设包括:从不更新基础数据集。

只使用 QSqlQueryModel。如果实在需要写subclassQSqlQueryModel。尽管一定要避免在用户部分通过 accident/error 公开传递“DROP”SQL 保留字的简单方法。

'High throughput' 用例:

没有简单的解决方案。高度依赖用例指标和其他项目。如果 table 被频繁访问或根据公共列排序是最好的,如果应用程序线程化得很好,那么这里可能建议坚持使用 QSqlQuery。每个线程都会获得一个连接以及所有需要执行的查询object。

但是,具有简化的、易于刷新的 read-only 视图 object,例如 QSqlQueryModelQSqlQuery object 的结合使用传递或生成似乎是个好主意。

显然,此用例需要更多测试,并且您需要提供更多信息才能为您提供更好的答案。

重要(所有用例):

您不必在每个 QSqlQuery 或对 QSqlQueryModel 的调用中指定每个列名称。如果您一般需要请求大量列名,请使用 maps/pairs 到 return 类别的相关名称 提供的名称列表。因此,例如,“PWM#”名称可以包含在 return 具有相似名称的所有字符串的一对中。然后 运行 一个 for 循环将 returned 值附加到您要执行的 SQL 查询。

我相信还有一些不错的快速子字符串搜索选项可以帮助您。然后,您可以在存储在支持所需功能的设计 class 包装器中的字符串中快速搜索 header 名称。

您能否提供有关需要同时提交大量列名的用例的更多信息?

如果对您要提交的查询类型、内存限制和/或速度问题有更好的解释,我可以想到更好的解决方案,可能还有一些代码。

根据你的问题,我假设你是 C++?