qt 操作多个sqlite文件

qt 操作多个sqlite文件

  • Chapter1 qt 操作多个sqlite文件
    • 1. 引入必要的头文件
    • 2. 创建并连接多个SQLite数据库
    • 3. 代码说明
    • 4. 注意事项
  • Chapter2 qt 多线程操作sqlite多文件
    • 1. 引入必要的头文件
    • 2. 创建数据库操作的工作线程类
    • 3. 在主线程中创建并启动多个工作线程
    • 4. 代码说明
    • 5. 运行结果
    • 6. 注意事项
  • Chapter3 QSqlQuery增删改查操作
    • 1.插入一条记录(增)
    • 2.查询字段(查)
    • 3.删除字段(删)
    • 4.更新字段(改)
  • Chapter4 深入解析 Qt 中的 bindValue 方法
    • 引言
    • 1. bindValue 方法简介
    • 2. 基本语法
    • 3. 参数化查询的优势
    • 4. 使用 bindValue 方法
    • 5. 示例代码
    • 6. 处理查询结果
    • 7. 示例代码
    • 8. 错误处理
    • 9. 事务处理


Chapter1 qt 操作多个sqlite文件

在Qt中操作多个SQLite数据库文件可以通过创建多个QSqlDatabase对象来实现。每个QSqlDatabase对象代表一个独立的数据库连接。以下是一个简单的示例,展示如何在Qt中操作多个SQLite数据库文件。

1. 引入必要的头文件

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

2. 创建并连接多个SQLite数据库

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建并连接第一个SQLite数据库
    QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");
    db1.setDatabaseName("database1.db");
    if (!db1.open()) {
        qDebug() << "Error: Could not open database1.db";
        return -1;
    }

    // 创建并连接第二个SQLite数据库
    QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE", "connection2");
    db2.setDatabaseName("database2.db");
    if (!db2.open()) {
        qDebug() << "Error: Could not open database2.db";
        return -1;
    }

    // 在第一个数据库中执行查询
    QSqlQuery query1(db1);
    if (!query1.exec("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY, name TEXT)")) {
        qDebug() << "Error: Could not create table in database1.db" << query1.lastError();
    }

    // 在第二个数据库中执行查询
    QSqlQuery query2(db2);
    if (!query2.exec("CREATE TABLE IF NOT EXISTS table2 (id INTEGER PRIMARY KEY, value INTEGER)")) {
        qDebug() << "Error: Could not create table in database2.db" << query2.lastError();
    }

    // 插入数据到第一个数据库
    if (!query1.exec("INSERT INTO table1 (name) VALUES ('Alice')")) {
        qDebug() << "Error: Could not insert data into database1.db" << query1.lastError();
    }

    // 插入数据到第二个数据库
    if (!query2.exec("INSERT INTO table2 (value) VALUES (100)")) {
        qDebug() << "Error: Could not insert data into database2.db" << query2.lastError();
    }

    // 关闭数据库连接
    db1.close();
    db2.close();

    return a.exec();
}

3. 代码说明

QSqlDatabase::addDatabase(“QSQLITE”, “connection1”): 创建一个名为connection1的数据库连接。"QSQLITE"表示使用SQLite数据库驱动。

db1.setDatabaseName(“database1.db”): 设置数据库文件的名称。如果文件不存在,SQLite会自动创建它。

db1.open(): 打开数据库连接。如果打开失败,返回false。

QSqlQuery query1(db1): 创建一个与db1关联的查询对象。所有通过query1执行的SQL语句都会在db1中执行。

query1.exec(“CREATE TABLE …”): 执行SQL语句。如果执行失败,可以通过query1.lastError()获取错误信息。

db1.close(): 关闭数据库连接。

4. 注意事项

连接名称: 每个数据库连接必须有一个唯一的名称(如"connection1"和"connection2")。如果不指定名称,Qt会使用默认连接。

资源管理: 确保在使用完数据库后关闭连接,以释放资源。

错误处理: 在实际应用中,应该对每个数据库操作进行错误处理,以确保程序的健壮性。

通过这种方式,你可以在Qt中同时操作多个SQLite数据库文件。

Chapter2 qt 多线程操作sqlite多文件

在Qt中使用多线程操作多个SQLite数据库文件时,需要注意SQLite的线程安全性以及Qt的多线程机制。SQLite默认支持多线程操作,但需要确保每个线程使用独立的数据库连接,以避免竞争条件。

以下是一个示例,展示如何在Qt中使用多线程操作多个SQLite数据库文件。

1. 引入必要的头文件

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QThread>
#include <QDebug>
#include <QList>
#include <QMutex>

2. 创建数据库操作的工作线程类

每个线程负责操作一个独立的SQLite数据库文件。

class DatabaseWorker : public QObject
{
    Q_OBJECT

public:
    DatabaseWorker(const QString &connectionName, const QString &databaseName, QObject *parent = nullptr)
        : QObject(parent), m_connectionName(connectionName), m_databaseName(databaseName) {}

public slots:
    void process()
    {
        // 创建数据库连接
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", m_connectionName);
        db.setDatabaseName(m_databaseName);

        if (!db.open()) {
            qDebug() << "Error: Could not open database" << m_databaseName << "in thread" << QThread::currentThread();
            emit finished();
            return;
        }

        // 执行数据库操作
        QSqlQuery query(db);
        if (!query.exec("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, value TEXT)")) {
            qDebug() << "Error: Could not create table in" << m_databaseName << query.lastError();
        }

        for (int i = 0; i < 10; ++i) {
            if (!query.exec(QString("INSERT INTO test (value) VALUES ('%1')").arg(QString::number(i)))) {
                qDebug() << "Error: Could not insert data into" << m_databaseName << query.lastError();
            }
        }

        qDebug() << "Database" << m_databaseName << "processed in thread" << QThread::currentThread();

        // 关闭数据库连接
        db.close();

        emit finished();
    }

signals:
    void finished();

private:
    QString m_connectionName;
    QString m_databaseName;
};

3. 在主线程中创建并启动多个工作线程

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 定义数据库文件列表
    QList<QString> databaseFiles = {"database1.db", "database2.db", "database3.db"};

    // 创建线程和工作者对象
    QList<QThread*> threads;
    QList<DatabaseWorker*> workers;

    for (int i = 0; i < databaseFiles.size(); ++i) {
        QString connectionName = QString("connection%1").arg(i);
        QString databaseName = databaseFiles.at(i);

        // 创建工作线程
        QThread *thread = new QThread();
        DatabaseWorker *worker = new DatabaseWorker(connectionName, databaseName);

        // 将工作者移动到线程中
        worker->moveToThread(thread);

        // 连接信号和槽
        QObject::connect(thread, &QThread::started, worker, &DatabaseWorker::process);
        QObject::connect(worker, &DatabaseWorker::finished, thread, &QThread::quit);
        QObject::connect(worker, &DatabaseWorker::finished, worker, &DatabaseWorker::deleteLater);
        QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);

        // 启动线程
        thread->start();

        // 保存线程和工作者对象
        threads.append(thread);
        workers.append(worker);
    }

    // 等待所有线程完成
    for (QThread *thread : threads) {
        thread->wait();
    }

    qDebug() << "All databases processed.";

    return a.exec();
}

4. 代码说明

DatabaseWorker类:

每个DatabaseWorker对象负责操作一个SQLite数据库文件。

使用QSqlDatabase::addDatabase创建独立的数据库连接,并通过moveToThread将工作者对象移动到独立的线程中。

多线程机制:

每个数据库操作在一个独立的线程中执行,避免阻塞主线程。

使用QThread管理线程的生命周期,并通过信号槽机制实现线程间通信。

线程安全性:

SQLite支持多线程操作,但每个线程必须使用独立的数据库连接。

如果多个线程需要访问同一个数据库文件,可以使用QMutex或SQLite的写锁机制来避免竞争条件。

资源管理:

在线程完成任务后,调用quit()和deleteLater()释放线程和工作者对象。

5. 运行结果

程序会创建多个线程,每个线程操作一个独立的SQLite数据库文件。输出示例如下:

复制
Database “database1.db” processed in thread QThread(0x12345678)
Database “database2.db” processed in thread QThread(0x23456789)
Database “database3.db” processed in thread QThread(0x34567890)
All databases processed.

6. 注意事项

SQLite的线程模式:

SQLite默认支持多线程操作,但需要确保每个线程使用独立的连接。

如果需要更高的并发性,可以启用SQLite的WAL模式(Write-Ahead Logging)。

线程数量:

不要创建过多的线程,否则可能会导致性能下降。可以根据实际需求调整线程数量。

错误处理:

在实际应用中,应该对每个数据库操作进行错误处理,以确保程序的健壮性。

通过这种方式,你可以在Qt中高效地使用多线程操作多个SQLite数据库文件。

Chapter3 QSqlQuery增删改查操作

我们需要插入多条数据,此时可以使用 QSqlQuery::exec() 函数一条一条插入数据,但是这里我们选择了另外一种方法:批量执行。首先,我们使用 QSqlQuery::prepare() 函数对这条 SQL 语句进行预处理,问号?相当于占位符,预示着以后我们可以使用实际数据替换这些位置。简单说明一下,预处理是数据库提供的一种特性,它会将 SQL 语句进行编译,性能和安全性都要优于普通的 SQL 处理。在上面的代码中,我们使用一个字符串列表 names 替换掉第一个问号的位置,一个整型列表 ages 替换掉第二个问号的位置,利用 QSqlQuery::addBindValue() 我们将实际数据绑定到这个预处理的 SQL 语句上。需要注意的是,names 和 ages 这两个列表里面的数据需要一一对应。然后我们调用 QSqlQuery::execBatch() 批量执行 SQL,之后结束该对象。这样,插入操作便完成了。

另外说明一点,我们这里使用了 ODBC 风格的?占位符,同样,我们也可以使用 Oracle 风格的占位符:

query.prepare("INSERT INTO student (name, age) VALUES (:name, :age)");

此时,我们就需要使用

query.bindValue(":name", names);
query.bindValue(":age", ages);

进行绑定。Oracle 风格的绑定最大的好处是,绑定的名字和值很清晰,与顺序无关。但是这里需要注意,bindValue() 函数只能绑定一个位置。比如

query.prepare("INSERT INTO test (name1, name2) VALUES (:name, :name)");
// ...
query.bindValue(":name", name);

只能绑定第一个 :name 占位符,不能绑定到第二个。

接下来我们依旧使用同一个查询对象执行一个 SELECT 语句。如果存在查询结果,QSqlQuery::next() 会返回 true,直到到达结果最末,返回 false,说明遍历结束。我们利用这一点,使用 while 循环即可遍历查询结果。使用 QSqlQuery::value() 函数即可按照 SELECT 语句的字段顺序获取到对应的数据库存储的数据。

对于数据库事务的操作,我们可以使用 QSqlDatabase::transaction() 开启事务,QSqlDatabase::commit() 或者 QSqlDatabase::rollback() 结束事务。使用 QSqlDatabase::database() 函数则可以根据名字获取所需要的数据库连接。

bool Widget::saveToDb(double value1, double value2, double value3, double value4)
{
    // 插入数据到第二个数据库
    QSqlQuery query2(db2);
    query2.prepare("INSERT INTO table2 (value1, value2, value3, value4) VALUES (:value1, :value2, :value3, :value4)");
    query2.bindValue(":value1", value1);
    query2.bindValue(":value2", value2);
    query2.bindValue(":value3", value3);
    query2.bindValue(":value4", value4);
    if (!query2.exec()) {
        qDebug() << "Error: Could not insert data into database2.db" << query2.lastError();
        QMessageBox::information(this, "错误", "插入记录失败: \n" + query2.lastError().text());
    }
    QMessageBox::information(this, "提示", "插入完成!");
    return true;
}


void Widget::on_pBtn_insert_clicked()
{
    double v1 = ui->lineEdit1->text().toDouble();
    double v2 = ui->lineEdit2->text().toDouble();
    double v3 = ui->lineEdit3->text().toDouble();
    double v4 = ui->lineEdit4->text().toDouble();
    this->saveToDb(v1, v2, v3, v4);
}

1.插入一条记录(增)

QSqlQuery query;
query.prepare("INSERT INTO table_name (column1, column2, column3) VALUES (:value1, :value2, :value3)");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

2.查询字段(查)

QSqlQuery query;
query.prepare("SELECT * FROM table_name WHERE column1 = :value1 AND column2 = :value2 AND column3 = :value3");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();
 
// 处理查询结果
while (query.next()) {
    // 在这里处理每一行的数据
}

3.删除字段(删)

QSqlQuery query;
query.prepare("DELETE FROM table_name WHERE column1 = :value1 AND column2 = :value2 AND column3 = :value3");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

4.更新字段(改)

QSqlQuery query;
query.prepare("UPDATE table_name SET column2 = :value2, column3 = :value3 WHERE column1 = :value1");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

Chapter4 深入解析 Qt 中的 bindValue 方法

原文链接:https://blog.csdn.net/festaw/article/details/140503911

引言

在应用程序开发中,数据库交互是常见的需求之一。为了确保应用程序的安全性和数据的准确性,Qt 提供了多种工具和方法来帮助开发者实现这一目标。其中,bindValue 方法是 QSqlQuery 类中一个非常关键的成员函数,用于实现参数化查询。本文将详细介绍 bindValue 方法的基本概念、使用方式以及在实际开发中的应用。

1. bindValue 方法简介

bindValue 方法是 QSqlQuery 类的一个成员函数,用于将实际的数据值绑定到参数化 SQL 语句中的占位符。这种方法可以有效防止 SQL 注入攻击,是一种安全的数据操作实践。

2. 基本语法

bindValue 方法的基本语法如下:

bool QSqlQuery::bindValue(const QString &placeholder, const QVariant &val)

placeholder:SQL 语句中的占位符,通常是一个字符串。
val:要绑定的数据值,类型为 QVariant。

3. 参数化查询的优势

使用参数化查询有以下优势:

安全性:防止 SQL 注入攻击。
灵活性:可以轻松地替换和修改数据值。
性能:数据库可以缓存和重用参数化查询的执行计划。

4. 使用 bindValue 方法

在使用 bindValue 方法之前,通常需要先使用 prepare 方法准备一个参数化的 SQL 语句。以下是使用 bindValue 方法的基本步骤:

准备 SQL 语句:使用 prepare 方法准备 SQL 语句。
绑定值:使用 bindValue 方法将数据值绑定到 SQL 语句的占位符。
执行查询:使用 exec 方法执行 SQL 语句。

5. 示例代码

以下是一个使用 bindValue 方法的示例:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("example.db");
    if (!db.open()) {
        qDebug() << "Error: Unable to open database";
        return 1;
    }

    QSqlQuery query;
    query.setDatabase(db);

    // 准备 SQL 语句
    query.prepare("INSERT INTO people (name, age) VALUES (:name, :age)");

    // 绑定值
    query.bindValue(":name", "John Doe");
    query.bindValue(":age", 30);

    // 执行查询
    if (query.exec()) {
        qDebug() << "Query executed successfully";
    } else {
        qDebug() << "Error:" << query.lastError().text();
    }

    return a.exec();
}

在这个示例中,我们准备了一个插入语句,并将两个参数 name 和 age 绑定到实际的数据值上。

6. 处理查询结果

对于查询操作,除了执行 SQL 语句外,还需要处理查询结果。以下是处理查询结果的步骤:

执行查询:使用 exec 方法执行 SQL 查询语句。
逐行读取结果:使用 next 方法逐行读取查询结果。
获取字段值:使用 value 方法获取每行的字段值。

7. 示例代码

以下是一个处理查询结果的示例:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("example.db");
    if (!db.open()) {
        qDebug() << "Error: Unable to open database";
        return 1;
    }

    QSqlQuery query;
    query.setDatabase(db);

    // 创建表
    query.exec("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");

    // 插入数据
    query.exec("INSERT INTO people (name, age) VALUES ('John Doe', 30)");

    // 准备查询
    query.prepare("SELECT * FROM people WHERE name = :name");

    // 绑定参数
    query.bindValue(":name", "John Doe");

    // 执行查询
    if (query.exec()) {
        while (query.next()) {
            int id = query.value(0).toInt();
            QString name = query.value(1).toString();
            int age = query.value(2).toInt();
            qDebug() << "ID:" << id << "Name:" << name << "Age:" << age;
        }
    } else {
        qDebug() << "Error:" << query.lastError().text();
    }

    return a.exec();
}

8. 错误处理

在执行 SQL 语句时,可能会遇到各种错误。QSqlQuery 提供了一些方法来检查和处理这些错误:

if (!query.exec()) {
    qDebug() << "Error:" << query.lastError().text();
}

9. 事务处理

在处理数据库事务时,bindValue 方法同样可以发挥作用。通过准备和执行 SQL 语句,可以确保事务的一致性和完整性。以下是事务处理的示例:

QSqlQuery query;
query.setDatabase(db);

query.startTransaction();
query.exec("INSERT INTO people (name, age) VALUES ('Alice', 25)");
query.exec("INSERT INTO people (name, age) VALUES ('Bob', 35)");
if (!query.commit()) {
    query.rollback();
    qDebug() << "Transaction failed:" << query.lastError().text();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯嵌入式学习日记(三)——按键的长按、短按与双击(三行按键法)【STM32】【HAL库】

目录 一、查阅相关资料二、程序的编写1、创建工程2、三行按键法3、短按与长按4、双击 一、查阅相关资料 想要进行一块板子的开发&#xff0c;需要先查阅资料了解器件连接。   从CT117E-M4产品手册中不难发现&#xff0c;按键分别有PB0、PB1、PB2、PA0分别对应B1、B2、B3、B4…

【网络安全 | 漏洞挖掘】通过JWT的IDOR实现账户接管

未经许可,不得转载。 文章目录 正文正文 在审查目标平台“redirect.com”的Web应用时,我发现它使用了JSON Web Token(JWT)进行身份验证,因此决定尝试进行账户接管(ATO)攻击。 首先,我创建了一个新账户并测试了其功能。在此过程中,我尝试在“firstName”字段输入XSS(…

从0到1入门RabbitMQ

一、同步调用 优势&#xff1a;时效性强&#xff0c;等待到结果后才返回 缺点&#xff1a; 拓展性差性能下降级联失败问题 二、异步调用 优势&#xff1a; 耦合度低&#xff0c;拓展性强异步调用&#xff0c;无需等待&#xff0c;性能好故障隔离&#xff0c;下游服务故障不影响…

CST直角反射器 --- 距离多普勒(RD图), 毫米波汽车雷达ADAS

之前几期介绍了雷达是如何从频域换去时域&#xff0c;然后时域计算距离。 这期我们加上一个维度&#xff0c;既看距离&#xff0c;又看速度。速度的计算当然就是多普勒原理&#xff0c;所以距离速度的二维图又叫range-doppler图。 启用雷达ADAS Range-Doppler模板&#xff1a…

手写一个Tomcat

Tomcat 是一个广泛使用的开源 Java Servlet 容器&#xff0c;用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂&#xff0c;但通过手写一个简易版的 Tomcat&#xff0c;我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat&#xff0c;并深…

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理

【从零开始学习计算机科学】计算机组成原理&#xff08;六&#xff09;异常事件处理 异常事件处理异常处理的数据通路异常事件入口地址 异常事件处理 异常和中断事件改变处理机正常指令的执行顺序。异常指令执行过程中&#xff0c;由于操作非法和指令非法引起的事件。陷阱指陷…

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍&#xff1a;使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径&#xff0c;之后一直点“下一步”直到完成 2 添加元器件 点击元…

高效运行 QwQ-32B + 错误修复

文章目录 QwQ-32B 错误修复⚙️ 官方推荐设置&#x1f44d; 推荐的 llama.cpp 设置&#x1f4d6; 教程&#xff1a;运行和修复的 QwQ-32B1、对于 llama.cpp 及使用 llama.cpp 的引擎&#xff1a;2、下载模型 测试3、测试/评估4、尝试不使用我们的修复方案&#xff1a; &#x…

R 语言科研绘图 --- 直方图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

1.5.1 掌握Scala内建控制结构 - 条件表达式

本文介绍了 Scala 中条件表达式的使用及其在实际任务中的应用。条件表达式的语法为 if (条件) 值1 else 值2&#xff0c;其结果类型取决于值1和值2的类型。如果类型相同&#xff0c;结果类型与它们相同&#xff1b;如果不同&#xff0c;则结果类型为 Any。通过两个任务展示了条…

Linux rootfs:如何开机就自动添加某个用户?

前言 项目开发需求&#xff0c;需要开机后就自动创建某个用户密码 厂家提供的sdk&#xff0c;只有adduser命令&#xff0c; 该命令添加用户时&#xff0c;会有终端交互&#xff0c; 需要手动输入2次密码&#xff0c; 所以无法通过简单脚本方式创建。 要实现自动填充密码&…

计算机三级网络技术知识点汇总【7】

第七章 路由器配置及使用 1. 路由器的基础知识 1.1 路由器的基本概念 路由器是工作在网络层的设备&#xff0c;负责将数据分组从源端主机经最佳路径传送到目的端主机&#xff0c;实现在网络层的互联。路由器工作在 TCP/IP 网络模型的网络层&#xff0c;对应于 OSI 网络参考模…

Compounding Geometric Operations for Knowledge Graph Completion(论文笔记)

CCF等级&#xff1a;A 发布时间&#xff1a;2023年7月 25年3月10日交 一、简介 使用知识图谱嵌入模型&#xff0c;将三元组&#xff08;h,r,t&#xff09;中关系 r 转化为平移、旋转、缩放矩阵对头节点以及尾节点进行运算&#xff0c;判定三元组的真实性。 二、原理 1.整…

mac系统安装

目录 准备工作 一、安装虚拟机 二、解锁系统 三、安装系统 四、部署系统 五、安装VMware Tools(选做) 为什么要安装VMware Tools,这是啥玩意? 六、配置共享文件夹(选做) 为什么要共享文件夹? 注意事项: 七、安装完成 准备工作 一、安装说明: 本教程分为7个部…

DNASimCLR:一种基于对比学习的基因序列数据分类的深度学习方法

摘要 DNASimCLR利用卷积神经网络和基于对比学习的SimCLR框架&#xff0c;从不同的微生物基因序列中提取复杂的特征。在包含宏基因组和病毒基因序列的两个经典的大规模未标记数据集上进行了预训练。后续的分类任务通过使用先前获得的模型对预训练的模型进行微调来完成。我们的实…

Ae 效果详解:VR 旋转球面

Ae菜单&#xff1a;效果/沉浸式视频/VR 旋转球面 Immersive Video/VR Rotate Sphere VR 旋转球面 VR Rotate Sphere效果用于对 VR 视频进行三轴旋转&#xff0c;以调整视频的视角方向。可用于校正拍摄时的角度偏差&#xff0c;或者根据创意需求模拟摄像机旋转。 本效果适用于所…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

&#xff08;1Prompt1Story&#xff09;是一种无训练的文本到图像生成方法&#xff0c;通过整合多个提示为一个长句子&#xff0c;并结合奇异值重加权&#xff08;SVR&#xff09;和身份保持交叉注意力&#xff08;IPCA&#xff09;技术&#xff0c;解决了生成图像中身份不一致…

Python----数据可视化(Seaborn二:绘图一)

常见方法 barplot方法 单独绘制条形图 catplot方法 可以条形图、散点图、盒图、小提亲图、等 countplot方法 统计数量 一、柱状图 seaborn.barplot(dataNone, xNone, yNone, hueNone, colorNone, paletteNone) 函数描述data用于绘图的数据集。x用于绘制长格式数据的输入。…

只音 1.2.0 |纯净无广告,畅听全网音乐,支持无损下载和批量下载

只音是一款全网音乐一网打尽的听歌利器&#xff0c;无需登录即可搜索抖音、网易云、QQ音乐等平台资源&#xff0c;无损音质直连播放。内置智能推荐算法&#xff0c;每日更新热门榜单与个性化歌单&#xff0c;轻松发现小众优质音乐。支持批量下载功能&#xff0c;一次性打包30首…

Python从入门到精通1:FastAPI

引言 在现代 Web 开发中&#xff0c;API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能&#xff0c;成为 Python 开发者的首选框架。本文将从零开始&#xff0c;详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例&a…