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
#include
#include
...

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
#include
...

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 %}

TitleRatingAuthor(s)
{% comment %}Display each book in a table row{% endcomment %}
{% for book in books %}

    {{ book.title }}
    {{ book.rating }}

{% endfor %}

2.创建sqlite数据库

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

`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
);

Original: https://blog.csdn.net/aggs1990/article/details/123942290
Author: ꧁白杨树下꧂
Title: Qt+Cutelyst学习笔记(十五)win10+Qt5.15.2+sqlite 访问数据库数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816276/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球