数据库SQLite的使用

      SQLite是一个C语言库,实现了一个小型、快速、独立、高可靠性、功能齐全的SQL数据库引擎SQLite文件格式稳定、跨平台且向后兼容。SQLite源代码属于公共领域(public-domain),任何人都可以免费将其用于任何目的。源码地址:https://github.com/sqlite/sqlite,最新发布版本为3.47.0。

      SQLite是关系型数据库,与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中。SQLite将整个数据库,包括定义、表、索引以及数据本身,作为一个单独的、可跨平台使用的文件存储在主机中

      SQLite提供了一个叫做sqlite3的独立程序用来查询和管理SQLite数据库文件,可从 https://www.sqlite.org/download.html 下载sqlite-tools-win-x64-3470000.zip获取到。

      所有的SQLite语句可以以任何关键字开始,如SELECT、INSERT、UPDATE、DELETE、ALTER、DROP等,所有的语句通常使用分号;结束

      Windows10上生成SQLite静态库:

      (1).从 https://www.sqlite.org/download.html 下载sqlite-dll-win-x64-3470000.zip和sqlite-amalgamation-3470000.zip

      (2).解压缩到同一目录下:此目录下有sqlite3.dll、sqlite3.def、sqlite3.h、sqlite3.c、sqlite3ext.h、shell.c

      (3).打开"Developer Command Prompt for VS 2022",并将其定位到存放sqlite的目录下,执行如下命令:执行完后会生成sqlite3.lib和sqlite3.exp

lib /DEF:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64

      SQLite开源的可视化工具DB Browser for SQLite(DB4S)的使用:

      1.SQLite数据库浏览器(DB4S)是一款高质量、可视化、开源工具,用于创建、设计和编辑与SQLite兼容的数据库文件。源码地址:https://github.com/sqlitebrowser/sqlitebrowser,license为GPL或类似的开源许可证,最新发布版本为v3.13.1。它是跨平台的,可在Windows、Linux、MacOS等操作系统上使用。DB4S操作:

      (1).创建和压缩数据库文件

      (2).创建、定义、修改和删除表

      (3).创建、定义和删除索引

      (4).浏览、编辑、添加和删除记录(records)

      (5).搜索记录

      (6).以文本形式导入和导出记录

      (7).从CSV文件导入和导出表

      (8).从SQL转储文件(dump files)导入和导出数据库

      (9).SQL查询并检查结果

      2.Windows10上安装DB4S:

      (1).从https://github.com/sqlitebrowser/sqlitebrowser/releases/tag/v3.13.1 下载DB.Browser.for.SQLite-v3.13.1-win64.zip,并解压缩

      (2).双击打开DB Browser for SQLite.exe即可:界面如下:

     

      (1).SQLite是不区分大小写的,但也有一些命令是大小写敏感的。

      (2).SQLite没有一个单独的用于存储日期和/或时间的存储类,但SQLite能够把日期和时间存储为TEXT、REAL或INTEGER值。

      (3).在对当前数据库进行操作(c++)前,需要先关闭DB4S。

      (4).DB4S没有刷新功能,而PostgreSQL的图形界面(pgAdmin 4)有。

      以下为测试代码段

      (1).创建数据库:

int create_database(const std::string& dbname)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db); // 如果数据库不存在,则会创建它
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;

	sqlite3_close(db);
	return ret;
}

      (2).删除数据库:直接调用C++17中的std::filesystem::remove函数删除类似*.db的文件

int delete_database(const std::string& dbname)
{
	namespace fs = std::filesystem;
	fs::path file{ dbname };
	if (fs::exists(file)) {
		try {
			fs::remove(file);
		}
		catch (const fs::filesystem_error& e) {
			std::cerr << "Error: " << e.what() << std::endl;
			return -1;
		}
	} else {
		std::cerr << "Warning: database file does not exist: " << dbname << std::endl;
		return -1;
	}

	return 0;
}

      (3).创建表:

int create_table(const std::string& dbname, const std::string& command)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db);
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;

	char* errmsg{ nullptr };
	ret = sqlite3_exec(db, command.c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to create table: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	sqlite3_close(db);
	return ret;
}

      (4).删除表:

int drop_table(const std::string& dbname, const std::string& tablename)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db);
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;

	char* errmsg{ nullptr };
	const std::string str{ "DROP TABLE " };
	ret = sqlite3_exec(db, (str+tablename).c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to drop table: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	sqlite3_close(db);
	return ret;
}

      (5).向表中插入数据:

int insert_into_teacher(const std::string& dbname, int id, const std::string& name, const std::string& addr, const std::string& sex)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db);
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;
	
	char* errmsg{ nullptr };
	std::string str{ "INSERT INTO teacher (id, name, addr, sex) VALUES (" };
	str = str + std::to_string(id) + ", '" + name + "', '" + addr + "', '" + sex + "');";
	ret = sqlite3_exec(db, str.c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to insert into teacher: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	sqlite3_close(db);
	return ret;
}

std::string get_current_time()
{
	auto timenow = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
	std::tm* now_tm = std::localtime(&timenow);
	std::ostringstream oss;
	oss << std::put_time(now_tm, "%Y-%m-%d %H:%M:%S");
	return oss.str();
}

int insert_into_student(const std::string& dbname, int id, const std::string& name, const std::string& addr, int age,
	float score, const std::string& date, const std::string& sex)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db);
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;

	char* errmsg{ nullptr };
	std::string str{ "INSERT INTO student (id, name, addr, age, score, date, sex) VALUES (" };
	str = str + std::to_string(id) + ", '" + name + "', '" + addr + "'," + std::to_string(age) + "," +
		std::to_string(score) + ", '" + date + "', '" + sex + "'); ";
	ret = sqlite3_exec(db, str.c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to insert into student: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	sqlite3_close(db);
	return ret;
}

      (6).向已有表中添加、删除列:

int alter_table(const std::string& dbname)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db);
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;

	char* errmsg{ nullptr };
	const std::string str{ "ALTER TABLE teacher " };

	const std::string str1{ "ADD COLUMN hobbies CHAR(64) DEFAULT swim;" };
	ret = sqlite3_exec(db, (str+str1).c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to add cloumn: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	const std::string str2{ "DROP COLUMN addr;" };
	ret = sqlite3_exec(db, (str + str2).c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to drop column: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	sqlite3_close(db);
	return ret;
}

      (7).删除表中数据:

int delete_table_data(const std::string& dbname)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db);
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;

	char* errmsg{ nullptr };
	const std::string str{ "DELETE FROM teacher WHERE id > 10000 OR sex='女';" };
	ret = sqlite3_exec(db, str.c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to delete data from teachar: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	sqlite3_close(db);
	return ret;
}

      (8).调整表中已有数据:

int update_table_data(const std::string& dbname)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db);
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;

	char* errmsg{ nullptr };
	const std::string str1 = std::string("UPDATE teacher SET sex = 'man' WHERE sex = ") + "\'" + gbk_to_utf8("男") + "\';";
	ret = sqlite3_exec(db, str1.c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to update data from teachar: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	const std::string str2 = std::string("UPDATE teacher SET sex = ") + "\'" + gbk_to_utf8("女") + "\'" + " WHERE sex = 'woman';";
	ret = sqlite3_exec(db, str2.c_str(), nullptr, nullptr, &errmsg);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to update data from teachar: " << ret << ", " << errmsg << std::endl;
		sqlite3_free(errmsg);
	}

	sqlite3_close(db);
	return ret;
}

      (9).查询表中数据:

int select_table_data(const std::string& dbname)
{
	sqlite3* db{ nullptr };
	auto ret = sqlite3_open(dbname.c_str(), &db);
	if (ret != SQLITE_OK)
		std::cerr << "Error: fail to sqlite3_open: " << ret << ", " << sqlite3_errmsg(db) << std::endl;

	const std::string query{ "SELECT * FROM student WHERE age >= 20 AND DATETIME(date) > DATETIME('2024-11-07 17:54:30');" };
	char* errmsg{ nullptr };
	sqlite3_stmt* stmt{ nullptr };
	ret = sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, 0);
	if (ret != SQLITE_OK) {
		std::cerr << "Error: fail to sqlite3_prepare_v2: " << ret << ", " << sqlite3_errmsg(db) << std::endl;
		return ret;
	}

	std::cout << "id\tname\taddr\tage\tscore\tdate\t\t\t\tsex" << std::endl;
	while (sqlite3_step(stmt) == SQLITE_ROW) {
		auto id = sqlite3_column_int(stmt, 0);
		auto name = utf8_to_gbk(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1))));
		auto addr = utf8_to_gbk(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 2))));
		auto age = sqlite3_column_int(stmt, 3);
		auto score = sqlite3_column_double(stmt, 4);
		auto date = std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 5)));
		auto sex = utf8_to_gbk(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 6))));

		std::cout << id << "\t" << name << "\t" << addr << "\t" << age << "\t" << score << "\t"
			<< date << "\t\t" << sex << std::endl;
	}

	sqlite3_finalize(stmt);
	sqlite3_close(db);
	return ret;
}

      全局变量设置如下:

const std::string table_teacher{ "CREATE TABLE teacher ("
						"id INTEGER PRIMARY KEY NOT NULL CHECK(id>1000),"
						"name TEXT NOT NULL,"
						"addr TEXT DEFAULT 'BeiJing',"
						"sex TEXT NOT NULL);" };
const std::string table_student{ "CREATE TABLE student ("
						"id INTEGER PRIMARY KEY NOT NULL,"
						"name CHAR(32) NOT NULL,"
						"addr CHAR(64) DEFAULT 'TianJin',"
						"age INTEGER,"
						"score REAL,"
						"date CHAR(24),"
						"sex CHAR(8) NOT NULL);" };

      SQLite中没有实现类似libpqxx中的set_client_encoding函数,如果表中数据有中文则会显示乱码,这里实现utf8和gbk之间的转换:

inline std::string gbk_to_utf8(const std::string& str)
{
#ifdef _MSC_VER
	// gbk to wchar
	auto len = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, nullptr, 0);
	std::wstring wstr(len, 0);
	::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &wstr[0], len);

	// wchar to utf8
	len = ::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);
	std::string u8str(len, 0);
	::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &u8str[0], len, nullptr, nullptr);

	u8str.pop_back(); // remove '\0'
	return u8str;
#else
	return std::string{"Unimplemented"};
#endif
}

inline std::string utf8_to_gbk(const std::string& u8str)
{
#ifdef _MSC_VER
	// utf8 to wchar
	auto len = ::MultiByteToWideChar(CP_UTF8, 0, u8str.c_str(), -1, nullptr, 0);
	std::wstring wstr(len, 0);
	::MultiByteToWideChar(CP_UTF8, 0, u8str.c_str(), -1, &wstr[0], len);

	// wchar to gbk
	len = ::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);
	std::string str(len, 0);
	::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &str[0], len, nullptr, nullptr);

	str.pop_back(); // remove '\0' 
	return str;
#else
	return std::string{"Unimplemented"};
#endif
}

      主函数如下:

int test_sqlite()
{
	const std::string dbname{ "info.db" };

	//create_database(dbname);
	delete_database(dbname);

	create_table(dbname, table_teacher);
	create_table(dbname, table_student);

	//drop_table(dbname, "teacher");
	//drop_table(dbname, "student");

	insert_into_teacher(dbname, 1111, gbk_to_utf8("Tom"), gbk_to_utf8("HeBei"), gbk_to_utf8("man"));
	insert_into_teacher(dbname, 5555, gbk_to_utf8("Tom"), gbk_to_utf8("北京"), gbk_to_utf8("男"));
	insert_into_teacher(dbname, 2222, gbk_to_utf8("小张"), gbk_to_utf8("天津"), gbk_to_utf8("woman"));
	insert_into_teacher(dbname, 16625, gbk_to_utf8("小王"), gbk_to_utf8("Tianjin"), gbk_to_utf8("女"));

	insert_into_student(dbname, 8, gbk_to_utf8("小王"), gbk_to_utf8("HeBei"), 32, 88.8f, get_current_time(), gbk_to_utf8("男"));
	insert_into_student(dbname, 28, gbk_to_utf8("小何"), gbk_to_utf8("深圳"), 8, 22.22f, get_current_time(), gbk_to_utf8("女"));
	std::this_thread::sleep_for(std::chrono::minutes(1));
	insert_into_student(dbname, 29, gbk_to_utf8("Lucy"), gbk_to_utf8("北京"), 18, 22.22f, get_current_time(), gbk_to_utf8("woman"));
	insert_into_student(dbname, 33, gbk_to_utf8("Tom"), gbk_to_utf8("深圳"), 28, 22.22f, get_current_time(), gbk_to_utf8("woman"));
	insert_into_student(dbname, 18, gbk_to_utf8("小李"), gbk_to_utf8("上海"), 28, 66.6f, get_current_time(), gbk_to_utf8("女"));
	std::this_thread::sleep_for(std::chrono::seconds(5));
	insert_into_student(dbname, 48, gbk_to_utf8("Tom"), gbk_to_utf8("深圳"), 38, 22.22f, get_current_time(), gbk_to_utf8("woman"));

	alter_table(dbname);
	delete_table_data(dbname);
	update_table_data(dbname);
	select_table_data(dbname);

	return 0;
}

      执行结果如下:

      DB4S显示内容如下:

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

openpyxl处理Excel模板,带格式拷贝行和数据填入

本文中用openpyxl操作Excell 模板,进行行拷贝和数据填充. 主要涉及单元格格式的拷贝,合并单元格的拷贝,行高和列宽的处理. 将模板表格分为三部分,头部,中间循环填充部分,尾部.模板参数中设置头部高度,循环部分高度,剩余为尾部. 拷贝时先拷贝填充头部 ,然后根据数据循环拷贝填…

【FPGA开发】AXI-Lite总线协议解读、Verilog逻辑开发与仿真、Alex Forencich代码解读

目录 AXI是什么AXI是如何工作的AXI-Lite定义AXI-Lite的关键特性AXI-Lite信号列表AXI-Lite信号时序时钟和复位握手机制写请求通道&#xff08;AW&#xff09;写数据通道&#xff08;W&#xff09;写响应通道&#xff08;B&#xff09;读请求通道&#xff08;AR&#xff09;读数据…

zabbix 7.0 安装(服务器、前端、代理等)

https://www.zabbix.com/download 使用上面的地址&#xff0c;按教程执行命令安装

uniapp—android原生插件开发(2原生插件开发)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; ***环境问题移步至&#xff1a;uniapp—an…

【DCCMCI】多模态情感分析的层次去噪、表征解纠缠和双通道跨模态-上下文交互

abstract 多模态情感分析旨在从文本、声音和视觉数据等各种模态中提取情感线索&#xff0c;并对其进行操作&#xff0c;以确定数据中固有的情感极性。尽管在多模态情感分析方面取得了重大成就&#xff0c;但在处理模态表征中的噪声特征、消除模态表征之间情感信息的实质性差距…

【网络安全】线程安全分析及List遍历

未经许可,不得转载。 文章目录 线程线程安全问题遍历List的方式方式一方式二方式三方式四(Java 8)方式五(Java 8 Lambda)遍历List的同时操作ListVector是线程安全的?使用线程安全的CopyOnWriteArrayList使用线程安全的List.forEach线程 线程是程序执行的最小单位。一个程…

基于MFC实现的赛车游戏

一、问题描述 游戏背景为一环形车道图&#xff0c;选择菜单选项“开始游戏”则可开始游戏。游戏的任务是使用键盘上的方向键操纵赛道上的蓝色赛车追赶红色赛车&#xff0c;红色赛车沿车道顺时针行驶&#xff0c;出发点和终点均位于车道左上方。任一赛车先达到终点则比赛结束。…

SpringBoot赋能的共享汽车业务管理系统

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

「QT」几何数据类 之 QLineF 浮点型直线类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

Elasticsearch专栏-4.es基本用法-查询api

es基本用法-查询api 说明查询所有某一字段匹配查询多字段查询bool查询范围查询精确查询正则匹配模糊查询结果处理 说明 es对数据的检索&#xff0c;总结下来就是两部分&#xff0c;即查询和处理。查询指的是查找符合条件的数据&#xff0c;包括查询所有、匹配查询、布尔查询、…

讨论一个mysql事务问题

最近在阅读一篇关于隔离级别的文章&#xff0c;文章中提到了一种场景&#xff0c;我们下面来分析一下。 文章目录 1、实验环境2、两个实验的语句执行顺序3、关于start transaction和start transaction with consistent snapshot4、实验结果解释4.1、实验14.2、实验24.3、调整实…

【AIGC】腾讯云语音识别(ASR)服务在Spring Boot项目中的集成与实践

腾讯云语音识别&#xff08;ASR&#xff09;服务在Spring Boot项目中的集成与实践 引言 在现代软件开发中&#xff0c;语音识别技术的应用越来越广泛&#xff0c;从智能助手到自动客服系统&#xff0c;语音识别技术都在发挥着重要作用。腾讯云提供了强大的语音识别服务&#…

基于Spring Boot的工程认证计算机课程管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于工程教育认证的计算机课程管理平台的相…

2024年度国际荐酒师(香港)协会花式马刀开香槟表演赛在穗举行

2024年度国际荐酒师&#xff08;香港&#xff09;协会花式马刀开香槟表演赛在穗举行 近日&#xff0c;一场别开生面的花式马刀开香槟表演赛在广州四季酒店盛大举行&#xff0c;此次活动由国际荐酒师&#xff08;香港&#xff09;协会精心指导&#xff0c;广东海上丝绸之路文化促…

mysql全量与增量备份

binlog日志&#xff1a; 从上一次全量备份到下一次全量备份直接产生的数据。 一、全备和增量备份介绍 1、全量备份&#xff1a; 备份所有数据库或只备份一个数据库&#xff0c;全量备份之后&#xff0c;全量备份之前的binlog日志就没用了&#xff0c;一般生产环境会保留3-7天…

Web前端开发--HTML语言

文章目录 前言1.介绍2.组成3.基本框架4.常见标签4.1双标签4.1.1.标题标签4.2.2段落标签4.1.3文本格式化标签4.1.4超链接标签4.1.5视频标签4.1.6 音频标签 4.2单标签4.2.1换行标签和水平线标签4.2.2 图像标签 5.表单控件结语 前言 生活中处处都有网站&#xff0c;无论你是学习爬…

存算一体化与边缘计算:重新定义智能计算的未来

随着数据量爆炸式增长和智能化应用的普及&#xff0c;计算与存储的高效整合逐渐成为科技行业关注的重点。数据存储和处理需求的快速增长推动了对计算架构的重新设计&#xff0c;“存算一体化”技术应运而生。同时&#xff0c;随着物联网、5G网络、人工智能&#xff08;AI&#…

Kubernetes-ArgoCD篇-03-部署

1、从 Git 存储库创建应用程序 包含留言簿应用程序的示例存储库可在 https://github.com/argoproj/argocd-example-apps.git 上找到&#xff0c;以演示 Argo CD 的工作原理。 1.1 argocd server port-forward 我们这里通过port-forward 访问 Argo CD&#xff1a; kubectl p…

6层板设计常用知识笔记

1. 6层板设计叠层方案 &#xff08;1&#xff09;叠层方案优选以下方式 &#xff08;2&#xff09;过孔做固定孔时 plated作为固定孔时需要去掉勾选&#xff0c;焊盘去金属化。 &#xff08;3&#xff09;屏蔽罩&#xff1a;电源、主控存储、wifi需要加屏蔽罩&#xff0c;屏蔽…

【mongodb】数据库的安装及连接初始化简明手册

NoSQL(NoSQL Not Only SQL )&#xff0c;意即"不仅仅是SQL"。 在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统&#xff08;RDBMS&#xff09;来处理。 通过应用实践证明&#xff0c;关系模型是非常适合于客户服务器…