Qt+Cutelyst学习笔记(十五)win10+Qt5.15.2+sqlite 访问数据库数据

前言:

本篇记录下,如何简单查询下数据库的内容,并不会深入太多

一、创建CUTELYST项目

找一个空白目录,注意不能有中文或空格,执行如下命令

#创建应用
cutelyst3-qt5.exe --create-app myapp

#进入应用目录
cd myapp

#创建名为“Books”的控制器
cutelyst3-qt5.exe --controller Books


 注:一定要进入应用的目录,否则创建控制器会出现异常

通过执行cutelyst命令创建名为“Site”的控制器,将创建一个src/site.cpp和src/site.h文件,但笔者发现,这两个文件没什么可看的,并且需要手工注册这个控制器

二、修改源码并编译

使用QtCreator打开并配置工程,

1.修改CMakeLists.txt工程文件,以查找QtSql

- find_package(Qt5 COMPONENTS Core Network)
+ find_package(Qt5 COMPONENTS Core Network Sql)

1.修改src/CMakeLists.txt工程文件

target_link_libraries(Hello
    ...
    Cutelyst::View::Grantlee # Add this line
    Cutelyst::Utils::Sql     # Add this line
    Qt5::Sql                 # Add this line
    ...
}

2.创建Grantlee视图、注册并实例化控制器

修改src/myapp.cpp

...
#include "books.h"
#include <Cutelyst/Plugins/View/Grantlee/grantleeview.h>
#include <QtSql>
#include <Cutelyst/Plugins/Utils/Sql>
...
bool myapp::init()
{
    ...
    auto view = new GrantleeView(this);
    view->setIncludePaths({ pathTo("root/src") });

    new Books(this);
    ...
}

将模板文件的基本目录从root更改为root/src

在src/books.h中,加入如下公有函数,用于浏览器查询时使用

C_ATTR(list, :Local)
void list(Context *c);

注:测试方法上的“Local”属性。这将导致在“控制器/方法”URL上执行测试操作 ,本例是"books/list"

在src/books.cpp中,添加实现

void Books::list(Context *c)
{
    QSqlQuery query = CPreparedSqlQueryThreadForDB("SELECT * FROM book", "MyDB");
    if (query.exec()) {
        c->setStash("books", Sql::queryToHashList(query));
    }

    c->setStash("template", "books/list.html");
}

默认情况下,Grantle将尝试呈现一个遵循命名模式“controller/method.html”的模板,我们在这里遵循该模式。但是,在其他情况下,需要指定模板文件 

变量“books”放置数据查询结果,以便在模板中使用。

3.创建数据库连接

使用QtSql,我们可以一次打开到数据库的连接,并在应用程序的生命周期内重复使用它,但需要注意的是,在派生新进程之前,不能打开它,否则所有子进程将共享相同的连接,并且行为未定义。

将virtual postFork()方法添加到主应用程序类中,如果数据库无法打开,则可以在主应用程序类中返回false:

// myapp.h
public:
   ...
virtual bool postFork() override;
// myapp.cpp
...
#include <QtSql>
#include <Cutelyst/Plugins/Utils/Sql>
...
bool MyApp::postFork()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", Sql::databaseNameThread("MyDB"));
    db.setDatabaseName("myapp.db");
    db.setConnectOptions("foreign_keys = ON");
    if (!db.open()) {
        qCritical() << "Failed to open database:" << db.lastError().text();
        return false;
    }
    return true;
}

 完成后,直接编译,可以得到生成的动态库

windows下是myapp.dll

linux下是libmyapp.so

二、运行新的动态库

1.创建一个root/src/books/list.html模板文件。以下是一个简单的示例:

{% comment %}This is a Grantlee comment.{% endcomment %}
 
{% comment %}Some basic HTML with a loop to display books{% endcomment %}
<table>
<tr><th>Title</th><th>Rating</th><th>Author(s)</th></tr>
{% comment %}Display each book in a table row{% endcomment %}
{% for book in books %}
  <tr>
    <td>{{ book.title }}</td>
    <td>{{ book.rating }}</td>
    <td></td>
  </tr>
{% endfor %}
</table>

2.创建sqlite数据库

SQL命令创建sqlite数据库myapp.db,SQL如下

--
-- Create a very simple database to hold book and author information
--
PRAGMA foreign_keys = ON;
CREATE TABLE book (
        id          INTEGER PRIMARY KEY,
        title       TEXT ,
        rating      INTEGER
);
-- 'book_author' is a many-to-many join table between books & authors
CREATE TABLE book_author (
        book_id     INTEGER REFERENCES book(id) ON DELETE CASCADE ON UPDATE CASCADE,
        author_id   INTEGER REFERENCES author(id) ON DELETE CASCADE ON UPDATE CASCADE,
        PRIMARY KEY (book_id, author_id)
);
CREATE TABLE author (
        id          INTEGER PRIMARY KEY,
        first_name  TEXT,
        last_name   TEXT
);
---
--- Load some sample data
---
INSERT INTO book VALUES (1, 'CCSP SNRS Exam Certification Guide', 5);
INSERT INTO book VALUES (2, 'TCP/IP Illustrated, Volume 1', 5);
INSERT INTO book VALUES (3, 'Internetworking with TCP/IP Vol.1', 4);
INSERT INTO book VALUES (4, 'Perl Cookbook', 5);
INSERT INTO book VALUES (5, 'Designing with Web Standards', 5);
INSERT INTO author VALUES (1, 'Greg', 'Bastien');
INSERT INTO author VALUES (2, 'Sara', 'Nasseh');
INSERT INTO author VALUES (3, 'Christian', 'Degu');
INSERT INTO author VALUES (4, 'Richard', 'Stevens');
INSERT INTO author VALUES (5, 'Douglas', 'Comer');
INSERT INTO author VALUES (6, 'Tom', 'Christiansen');
INSERT INTO author VALUES (7, 'Nathan', 'Torkington');
INSERT INTO author VALUES (8, 'Jeffrey', 'Zeldman');
INSERT INTO book_author VALUES (1, 1);
INSERT INTO book_author VALUES (1, 2);
INSERT INTO book_author VALUES (1, 3);
INSERT INTO book_author VALUES (2, 4);
INSERT INTO book_author VALUES (3, 5);
INSERT INTO book_author VALUES (4, 6);
INSERT INTO book_author VALUES (4, 7);
INSERT INTO book_author VALUES (5, 8);

3.设置好环境变量,执行如下命令

#运行服务
cutelyst3-qt5.exe --server --app-file src/myapp -- --chdir ..

#--app-file 后的参数是应用程序(dll库)的位置,请读者自行修改
#注:可以省略dll扩展名

注:可以省略应用程序后缀,如.so, .dll, .dylib,因为它会自动查找带有适当后缀的文件。

注:--chdir 后面的参数,是root所在的目录,同时也是数据库文件放置的目录,使用影子编译的小伙伴要注意下,一定要放对参数

命令行输出如下

运行后,打开本地浏览器,输入 localhost:3000/books/list,显示如下

  命令行输出如下

 至此,本次测试完成

 本次测试示例源码下载

后记

下一篇,添加下简单的CSS效果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꧁白杨树下꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值