前言:
本篇记录下,如何简单查询下数据库的内容,并不会深入太多
一、创建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效果