《Python 与 SQLite:强大的数据库组合》
《Python 与 SQLite:强大的数据库组合》
- 一、Python 与 SQLite 的结合
- 二、安装与连接
- (一)安装 SQLite 模块
- (二)连接到数据库
- 三、数据库操作
- (一)创建表格
- (二)插入数据
- (三)查询数据
- (四)更新和删除数据
- 四、事务处理与异常处理
- (一)事务处理
- (二)异常处理
- 五、数据库索引与备份恢复
- (一)创建数据库索引
- (二)数据库备份和恢复
- 六、安全性考虑
- 假设用户的输入
- 参数化查询
- 假设用户的输入
- 进行输入验证和数据清理
- 参数化查询
- 七、应用场景
- (一)小型网站
- (二)嵌入式设备
- (三)数据库教学
- (四)本地应用程序
一、Python 与 SQLite 的结合
Python 作为一种高级编程语言,具有诸多特点与优势。它以其用户友好性著称,语法简洁明了,代码结构清晰,即使是初学者也能快速上手。Python 的代码简洁性使得开发效率极高,开发者可以用较少的代码实现复杂的功能。同时,Python 易于学习和理解,其以空白字符划分代码块的设计,减少了复杂的语法元素,提高了代码的可读性。
SQLite 作为嵌入式关系数据库管理系统,也有其独特的特点与优势。首先,它具有零配置的特点,无需复杂的安装和配置过程,开发人员可以很容易地将其集成到应用程序中。SQLite 高度可靠,其事务处理完全兼容 ACID,能够确保数据的一致性和完整性。而且,SQLite 易于使用,它使用简单的 SQL 语言,即使没有专业的数据库知识也能轻松操作。此外,SQLite 具有跨平台的特性,在各种平台上都能良好运行,为开发者提供了极大的便利。
Python 与 SQLite 的结合具有显著的优势。Python 丰富的第三方库可以与 SQLite 无缝对接,为数据的存储和管理提供了强大的支持。例如,使用 Python 的 sqlite3 库,开发人员可以轻松地与 SQLite 数据库进行交互,实现数据的增删改查等操作。这种结合适用于各种应用场景,无论是小型项目还是大型应用,都能发挥出巨大的作用。
二、安装与连接
(一)安装 SQLite 模块
Python 从 2.5 版本开始自带 sqlite3 模块,这使得在 Python 中操作 SQLite 数据库变得极为方便。对于低版本的 Python,如 Python 2.4 或更早版本,则需要安装 Python SQLite 扩展。安装方法可以使用 easy_install 或 pip 命令进行安装,具体如下:
easy_install pysqlite或者pip install pysqlite。
(二)连接到数据库
在 Python 中,连接到 SQLite 数据库需要使用 sqlite3 模块中的connect()函数。这个函数接受一个参数,即数据库文件的路径。如果指定的数据库文件存在,那么就会连接到这个已存在的数据库;如果文件不存在,connect()函数会自动创建一个新的数据库文件。
例如,以下代码展示了如何连接到一个名为example.db的数据库:
import sqlite3
conn = sqlite3.connect('example.db')
如果使用’:memory:'表示文件名,Python 会创建一个内存数据库。内存数据库中的所有数据均保存在内存中,关闭连接对象时,所有数据自动删除。如下所示:
cn = sqlite3.connect(':memory:')
如果使用空字符串作为文件名,Python 会创建一个临时数据库。临时数据库有一个临时文件,所有数据保存在临时文件中。连接对象关闭时,临时文件和数据也会自动删除。
cn = sqlite3.connect('')
执行完所有操作后,应执行close()方法关闭连接对象,释放占用的资源。
cn.close()
三、数据库操作
(一)创建表格
SQLite 的 CREATE TABLE 语句用于在数据库中创建新表。以下是一个示例,创建一个名为 COMPANY 的表,包含 ID、NAME、AGE、ADDRESS 和 SALARY 字段:
CREATE TABLE COMPANY(ID INT PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,AGE INT NOT NULL,ADDRESS CHAR(50),SALARY REAL
);
在这个例子中,ID 字段被定义为整数类型且为主键,不能为空;NAME 和 AGE 字段也不能为空,分别为文本类型和整数类型;ADDRESS 字段为固定长度为 50 的字符类型,可以为空;SALARY 字段为实数类型,可以为空。
在 Python 中,可以使用 sqlite3 模块的游标对象来执行这个创建表的 SQL 语句。例如:
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS COMPANY (ID INT PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,AGE INT NOT NULL,ADDRESS CHAR(50),SALARY REAL
)''')conn.commit()
conn.close()
CREATE TABLE IF NOT EXISTS 语句确保只有在表不存在时才会创建表,避免重复创建表导致的错误。
(二)插入数据
插入单条记录:
可以使用 INSERT INTO 语句向表格中插入单条记录。例如:
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(1,'张三',32,'California',20000.00);
在 Python 中,可以使用游标对象的 execute 方法执行这个插入语句:
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()cursor.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(1,'张三',32,'California',20000.00)")conn.commit()
conn.close()
插入多条记录:
可以使用 executemany 方法一次性插入多条记录。例如:
import sqlite3data = [(2,'李四',33,'New York',25000.00),(3,'王五',34,'London',30000.00)]conn = sqlite3.connect('example.db')
cursor = conn.cursor()sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(?,?,?,?,?)"
cursor.executemany(sql, data)conn.commit()
conn.close()
(三)查询数据
获取所有记录:
使用 SELECT * FROM 语句可以获取表格中的所有记录。在 Python 中,可以使用游标对象的 fetchall 方法获取所有查询结果。例如:
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()cursor.execute("SELECT * FROM COMPANY")
rows = cursor.fetchall()for row in rows:print(row)conn.close()
分页查询:
可以使用 LIMIT 和 OFFSET 关键字实现分页查询。例如,查询前 10 条记录:
SELECT * FROM COMPANY LIMIT 10;
在 Python 中执行这个查询语句并获取结果的方法与获取所有记录类似。
(四)更新和删除数据
更新数据:
使用 UPDATE 语句可以更新表格中的数据。例如,将 ID 为 1 的记录的 SALARY 字段更新为 25000.00:
UPDATE COMPANY set SALARY = 25000.00 where ID = 1;
在 Python 中,可以使用游标对象的 execute 方法执行这个更新语句:
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()cursor.execute("UPDATE COMPANY set SALARY = 25000.00 where ID = 1")conn.commit()
conn.close()
删除数据:
使用 DELETE FROM 语句可以删除表格中的数据。例如,删除 ID 为 1 的记录:
DELETE FROM COMPANY where ID = 1;
在 Python 中执行这个删除语句的方法与更新数据类似。如果要删除所有记录,可以使用没有 WHERE 子句的 DELETE FROM 语句:
DELETE FROM COMPANY;
四、事务处理与异常处理
(一)事务处理
事务是一个包括一系列操作的任务,这些操作要么全部成功,要么全部失败。SQLite 中的事务具有原子性、一致性、隔离性和持久性(ACID)特性,确保了数据的可靠性。
原子性意味着事务中的所有操作要么全部成功执行,要么全部不执行。如果在事务执行过程中出现任何错误,事务会回滚到初始状态,就像这些操作从未发生过一样。例如,在一个银行转账的场景中,如果从账户 A 向账户 B 转账的过程中出现问题,那么整个转账操作将被撤销,确保账户 A 和账户 B 的资金状态不会因为部分操作失败而出现不一致。
一致性要求数据库始终处于一致的状态。在事务开始和结束时,数据库必须满足所有的完整性约束。例如,在一个订单处理系统中,如果一个订单的创建涉及多个数据库操作,如插入订单记录、更新库存数量等,那么这些操作必须一起成功执行,以确保数据库的一致性。如果其中任何一个操作失败,事务将回滚,以保持数据库的一致性。
隔离性确保事务之间相互独立,不会互相干扰。每个事务都感觉像是在一个独立的数据库环境中执行,不受其他正在进行的事务的影响。这可以防止数据的不一致性和并发问题。例如,在一个多用户的在线购物系统中,不同用户的购物车操作应该相互隔离,不会因为其他用户的操作而受到影响。
持久性表示一旦事务被提交,其结果就会永久保存。即使系统发生故障,如电源故障或软件崩溃,已提交的事务的结果也不会丢失。这通常通过将数据写入持久存储设备(如硬盘)来实现。
在 Python 中进行事务处理时,可以使用begin_transaction()、commit()和rollback()方法。以下是一个示例代码:
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()try:# 开始事务conn.execute('BEGIN TRANSACTION')cursor.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(4,'赵六',35,'Paris',35000.00)")cursor.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(5,'孙七',36,'Tokyo',40000.00)")# 提交事务conn.commit()print("事务提交成功")
except sqlite3.Error as e:# 发生错误,回滚事务conn.rollback()print(f"发生错误:{e},事务已回滚")
finally:conn.close()
在这个例子中,首先使用begin_transaction()方法开始一个事务,然后执行两条插入语句。如果这两条插入语句都成功执行,那么使用commit()方法提交事务。如果在执行过程中出现任何错误,将捕获异常并使用rollback()方法回滚事务。
另外,Python 的sqlite3模块还提供了自动事务管理的功能。如果在执行操作后没有显式调用commit(),那么在下一次操作开始时,上一个事务会自动提交。如果在执行操作时发生异常,事务会自动回滚。例如:
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()try:cursor.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(6,'周八',37,'Berlin',45000.00)")# 由于没有显式调用 commit,如果在下一次操作前发生异常,会自动回滚
except sqlite3.Error as e:print(f"发生错误:{e}")
finally:# 关闭连接conn.close()
(二)异常处理
在进行数据库操作时,进行异常处理是非常重要的,它可以防止数据库文件无法创建或打开、SQL 语句执行失败等情况。
如果数据库文件无法创建或打开,可能是由于文件路径错误、权限不足或其他原因导致的。在这种情况下,应该捕获异常并给出相应的错误提示,以便开发者能够及时解决问题。例如:
import sqlite3try:conn = sqlite3.connect('wrong_path/example.db')
except sqlite3.Error as e:print(f"无法打开数据库文件:{e}")如果 SQL 语句执行失败,可能是由于语法错误、数据类型不匹配、约束违规等原因导致的。在这种情况下,也应该捕获异常并给出相应的错误提示,以便开发者能够定位问题并进行修复。例如:
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()try:cursor.execute("SELECT * FROM non_existent_table")
except sqlite3.DatabaseError as e:print(f"数据库错误:{e}")
finally:conn.close()
在实际应用中,可以根据具体的异常类型进行不同的处理。例如,如果是语法错误,可以提示开发者检查 SQL 语句的语法;如果是约束违规,可以提示开发者检查数据的完整性。通过合理的异常处理,可以提高程序的稳定性和可靠性,避免因为数据库操作失败而导致程序崩溃。
五、数据库索引与备份恢复
(一)创建数据库索引
索引是数据库中用于加速数据检索的重要组成部分。在 SQLite 中,创建索引可以显著提高查询性能。例如,在一个包含大量数据的表格中,如果经常需要根据某个字段进行查询,那么在该字段上创建索引可以大大加快查询速度。
在 Python 中,可以使用 sqlite3 模块的游标对象执行 CREATE INDEX 语句来创建索引。以下是一个示例代码,在名为 COMPANY 的表格的 NAME 字段上创建索引:
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()cursor.execute("CREATE INDEX IF NOT EXISTS idx_name ON COMPANY (NAME)")conn.commit()
conn.close()
这里使用了 CREATE INDEX IF NOT EXISTS 语句,确保只有在索引不存在时才会创建索引,避免重复创建索引导致的错误。
创建索引需要注意一些事项。首先,索引会占用额外的存储空间,因此在创建索引时需要权衡查询性能和存储空间的需求。其次,索引的创建和维护会增加数据库的写入操作的时间,因为每次插入、更新或删除数据时,都需要更新索引。因此,在频繁进行写入操作的场景下,需要谨慎考虑是否创建索引。
(二)数据库备份和恢复
定期备份数据库以防止数据丢失是一个非常重要的操作。SQLite 数据库虽然相对较小且易于管理,但也可能会因为硬件故障、软件错误或人为操作失误而导致数据丢失。因此,定期备份数据库可以确保在发生意外情况时能够快速恢复数据。
备份的重要性
防止数据丢失:硬件故障、软件错误、人为操作失误等都可能导致数据库中的数据丢失。定期备份可以在这些情况发生时,快速恢复数据,减少损失。
数据恢复:如果数据库出现损坏或数据被误删除,可以使用备份文件进行恢复。备份文件可以作为数据库的一个副本,在需要时进行恢复操作。
历史数据保存:备份文件可以作为历史数据的保存,方便进行数据分析和审计。
备份方法
复制数据库文件:这是一种简单的备份方法。可以使用 Python 的 shutil 模块复制数据库文件。例如:
import shutilsrc_db = 'example.db'backup_db = 'example_backup.db'shutil.copy(src_db, backup_db)
使用 SQLite 的备份命令:SQLite 提供了一些备份命令,可以用于备份数据库。例如,可以使用 .backup 命令在 SQLite 命令行中进行备份:
sqlite>.backup example_backup.db example.db
这里将 example.db 备份到 example_backup.db。
恢复方法
如果使用复制数据库文件的方法进行备份,可以在需要恢复时,将备份文件复制回原始位置。例如:
import shutilbackup_db = 'example_backup.db'src_db = 'example.db'shutil.copy(backup_db, src_db)
如果使用 SQLite 的备份命令进行备份,可以使用 .restore 命令进行恢复:
sqlite>.restore example.db example_backup.db
这里将 example_backup.db 恢复到 example.db。
在实际应用中,可以根据具体情况选择合适的备份和恢复方法。同时,为了确保备份的有效性,建议定期测试备份文件的可恢复性,以确保在需要时能够成功恢复数据。
六、安全性考虑
在使用 Python 和 SQLite 进行数据库操作时,安全性是至关重要的。特别是在将用户提供的数据插入到数据库之前,必须进行输入验证和数据清理,以防止 SQL 注入攻击。
SQL 注入攻击是一种常见的安全漏洞,攻击者通过将恶意 SQL 代码嵌入到用户输入中,试图控制数据库查询或命令。例如,如果一个应用程序直接将用户输入的字符串拼接在 SQL 语句中,攻击者就可以输入恶意的 SQL 代码,从而获取、修改或删除数据库中的数据。
为了防止 SQL 注入攻击,可以使用参数化查询。参数化查询是一种编程技术,它将 SQL 命令的结构和数据分开处理。在 Python 的 sqlite3 模块中,可以通过使用占位符 ? 来实现参数化查询。例如:
import sqlite3
假设用户的输入
user_supplied_name = 'John'
user_supplied_age = 30
参数化查询
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute("INSERT INTO COMPANY (NAME, AGE) VALUES (?,?)", (user_supplied_name, user_supplied_age))conn.commit()
conn.close()
在这个例子中,? 是一个占位符,用于在执行时被真实的参数值替换。这种方式保护了程序免受 SQL 注入攻击,因为即使用户的输入中包含了 SQL 代码片段,它们也会被数据库视为普通数据而不是可执行的 SQL 代码。
除了参数化查询,还可以进行输入验证和数据清理。输入验证可以确保用户输入的数据符合预期的格式和范围。例如,可以检查用户输入的字符串长度是否在合理范围内,数字是否在合法的数值范围内等。数据清理可以去除用户输入中的潜在危险字符,如单引号、双引号等。
以下是一个进行输入验证和数据清理的示例代码:
import sqlite3def validate_input(name, age):# 输入验证if not isinstance(name, str) or len(name) < 2:raise ValueError('Name must be a string of at least 2 characters.')if not isinstance(age, int) or age < 0:raise ValueError('Age must be a positive integer.')# 数据清理cleaned_name = name.replace("'", "").replace('"', '')return cleaned_name, age
假设用户的输入
user_supplied_name = 'John'
user_supplied_age = 30
进行输入验证和数据清理
cleaned_name, cleaned_age = validate_input(user_supplied_name, user_supplied_age)
参数化查询
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute("INSERT INTO COMPANY (NAME, AGE) VALUES (?,?)", (cleaned_name, cleaned_age))conn.commit()
conn.close()
在这个例子中,validate_input 函数进行了输入验证和数据清理。如果输入不符合要求,函数会抛出一个 ValueError 异常。在实际应用中,可以根据具体的需求进行更复杂的输入验证和数据清理。
总之,在将用户提供的数据插入到数据库之前,进行输入验证和数据清理,以及使用参数化查询是防止 SQL 注入攻击的重要措施。这些措施可以提高应用程序的安全性,保护数据库中的数据不被恶意攻击。
七、应用场景
(一)小型网站
SQLite 适用于中小规模流量的网站。对于大多数中小型流量的网站(也就是大多数网站),每天点击量少于 10 万的网站都可以正常运行。这是一个保守的估计,SQLite 已经被证明可以处理 10 倍以上的流量。例如,一些个人博客、小型企业网站等,数据量相对较小,访问量也不高,使用 SQLite 作为数据库可以满足需求。它无需独立的服务器进程,安装和配置简单,能够快速搭建起网站的数据库系统。同时,Python 与 SQLite 的结合使得开发更加高效,开发者可以利用 Python 的强大功能进行网站的开发和数据管理。
(二)嵌入式设备
SQLite 适用于手机、PDA、机顶盒、以及其他嵌入式设备。作为一个嵌入式数据库它也能够很好的应用于客户端程序。在嵌入式设备中,资源通常有限,而 SQLite 的轻量级特性使其成为理想的选择。它完全包含在一个文件中,不需要独立的服务器进程,占用资源少。例如,在智能手机应用中,使用 SQLite 可以存储用户的设置、应用数据等。Python 可以与 SQLite 一起在嵌入式设备上进行开发,为应用提供数据存储和管理功能。
(三)数据库教学
SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能,非常适合用于数据库教学。学生可以通过使用 Python 与 SQLite 来学习数据库的基本操作,如创建表、插入数据、查询数据、更新数据和删除数据等。由于 SQLite 的简单性和易用性,学生可以快速上手,理解数据库的基本概念和操作。同时,Python 的简洁语法和丰富的库也为教学提供了便利,可以帮助学生更好地理解和实践数据库操作。
(四)本地应用程序
其单一磁盘文件的特性,并且不支持远程连接,使其适用于本地的应用程序,如 PC 客户端软件。在本地应用程序中,数据通常只需要在本地存储和管理,不需要远程访问。SQLite 的这种特性使得它非常适合用于本地应用程序。例如,一些桌面应用程序,如文本编辑器、图像编辑软件等,可以使用 SQLite 来存储用户的设置、历史记录等数据。Python 可以与 SQLite 结合,为本地应用程序提供强大的数据存储和管理功能。
相关文章:
《Python 与 SQLite:强大的数据库组合》
《Python 与 SQLite:强大的数据库组合》 一、Python 与 SQLite 的结合二、安装与连接(一)安装 SQLite 模块(二)连接到数据库 三、数据库操作(一)创建表格(二)插入数据&am…...
Golang | Leetcode Golang题解之第552题学生出勤记录II
题目: 题解: const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…...
Vue3 常用代码指南手抄,超详细 cheatsheet
一、Vue3 基础 1.1 创建 Vue3 项目 使用 Vite 创建 npm create vitelatest my-vue-app -- --template vue cd my-vue-app npm install npm run dev使用 Vue CLI 创建 npm install -g vue/cli vue create my-vue-app1.2 项目结构 my-vue-app ├── node_modules ├── pu…...
结构体是否包含特定类型的成员变量
结构体是否包含特定类型的成员变量 在C中,可以使用模板元编程和类型特性(type traits)来判断一个结构体是否包含特定类型的成员变量。这通常通过std::is_member_object_pointer类型特性来实现,它可以用来检查给定的成员指针是否指…...
堆排序与链式二叉树:数据结构与排序算法的双重探索
大家好,我是小卡皮巴拉 文章目录 目录 引言 一.堆排序 1.1 版本一 核心概念 堆排序过程 1.2 版本二 堆排序函数 HeapSort 向下调整算法 AdjustDown 向上调整算法 AdjustUp 二.链式二叉树 2.1 前中后序遍历 链式二叉树的结构 创建链式二叉树 前序遍历…...
用 Python 从零开始创建神经网络(四):激活函数(Activation Functions)
激活函数(Activation Functions) 引言1. 激活函数的种类a. 阶跃激活功能b. 线性激活函数c. Sigmoid激活函数d. ReLU 激活函数e. more 2. 为什么使用激活函数3. 隐藏层的线性激活4. 一对神经元的 ReLU 激活5. 在隐蔽层中激活 ReLU6. ReLU 激活函数代码7. …...
使用 Flask 和 ONLYOFFICE 实现文档在线编辑功能
提示:CSDN 博主测评ONLYOFFICE 文章目录 引言技术栈环境准备安装 ONLYOFFICE 文档服务器获取 API 密钥安装 Flask 和 Requests 创建 Flask 应用项目结构编写 app.py创建模板 templates/index.html 运行应用功能详解文档上传生成编辑器 URL显示编辑器回调处理 安全性…...
【C++】【算法基础】序列编辑距离
编辑距离 题目 给定 n n n个长度不超过 10 10 10 的字符串以及 m m m 次询问,每次询问给出一个字符串和一个操作次数上限。 对于每次询问,请你求出给定的 n n n个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。 每个…...
【Android】轮播图——Banner
引言 Banner轮播图是一种在网页和移动应用界面设计中常见的元素,主要用于在一个固定的区域内自动或手动切换一系列图片,以展示不同的内容或信息。这个控件在软件当中经常看到,商品促销、热门歌单、头像新闻等等。它不同于ViewPgaer在于无需手…...
学SQL,要安装什么软件?
先上结论,推荐MySQLDbeaver的组合。 学SQL需要安装软件吗? 记得几年前我学习SQL的时候,以为像Java、Python一样需要安装SQL软件包,后来知道并没有所谓SQL软件,因为SQL是一种查询语言,它用来对数据库进行操…...
webstorm 设置总结
编辑器-》文件类型-》忽略的文件和文件夹-》加上node_modules 修改WebStorm 内存有两种方式。 1. 点击菜单中的Help -> change memory settings 弹出设置内存窗口,修改最大内存大小。然后点击Save and Restart 即可。 2. 点击菜单中的Help -> Edit Custom V…...
基于Spring Boot的养老保险管理系统的设计与实现,LW+源码+讲解
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统养老保险管理系统信息管理难度大,容错率低&a…...
Java | Leetcode Java题解之第541题反转字符串II
题目: 题解: class Solution {public String reverseStr(String s, int k) {int n s.length();char[] arr s.toCharArray();for (int i 0; i < n; i 2 * k) {reverse(arr, i, Math.min(i k, n) - 1);}return new String(arr);}public void reve…...
sql分区
将学员表student按所在城市使用PARTITION BY LIST 1、创建分区表。 CREATE TABLE public.student( sno numeric(4,0), sname character varying(20 char),gender character varying(2 char), phone numeric(11,0), …...
[OpenGL]使用OpenGL实现硬阴影效果
一、简介 本文介绍了如何使用OpenGL实现硬阴影效果,并在最后给出了全部的代码。本文基于[OpenGL]渲染Shadow Map,实现硬阴影的流程如下: 首先,以光源为视角,渲染场景的深度图,将light space中的深度图存储…...
嵌入式采集网关(golang版本)
为了一次编写到处运行,使用纯GO编写,排除CGO,解决在嵌入式中交叉编译难问题 硬件设备:移远EC200A-CN LTE Cat 4 无线通信模块,搭载openwrt操作系统,90M内存...
ctfshow(328)--XSS漏洞--存储型XSS
Web328 简单阅读一下页面。 是一个登录系统,存在一个用户管理数据库。 那么我们注册一个账号,在账号或者密码中植入HTML恶意代码,当管理员访问用户管理数据库页面时,就会触发我们的恶意代码。 思路 我们向数据库中写入盗取管理员…...
【C#】Thread.CurrentThread的用法
Thread.CurrentThread 是 System.Threading.Thread 类的一个静态属性,它返回当前正在执行的线程对象。通过 Thread.CurrentThread,可以访问和修改当前线程的各种属性和方法。 下面是一些常见的用法和示例: 1. 获取当前线程的信息 使用 Thr…...
简单分享一下淘宝商品数据自动化抓取的技术实现与挑战
在电子商务领域,数据是驱动决策的关键。淘宝作为国内最大的电商平台之一,其商品数据对电商从业者来说具有极高的价值。然而,从淘宝平台自动化抓取商品数据并非易事,涉及多重技术和法律挑战。本文将从技术层面分析实现淘宝商品数据…...
Netty篇(入门编程)
目录 一、Hello World 1. 目标 2. 服务器端 3. 客户端 4. 流程梳理 💡 提示 5. 运行结果截图 二、Netty执行流程 1. 流程分析 2. 代码案例 2.1. 引入依赖 2.2. 服务端 服务端 服务端处理器 2.3. 客户端 客户端 客户端处理器 2.4. 代码截图 一、Hel…...
【渗透测试】payload记录
Java开发使用char[]代替String保存敏感数据 Java Jvm会提供内存转储功能,当Java程序dump后,会生成堆内存的快照,保存在.hprof后缀的文件中,进而导致敏感信息的泄露。char[]可以在存储敏感数据后手动清零,String对象会…...
2024自动驾驶线控底盘行业研究报告
自动驾驶线控底盘是实现自动驾驶的关键技术之一,它通过电子信号来控制车辆的行驶,包括转向、制动、驱动、换挡和悬架等系统。线控底盘技术的发展对于自动驾驶汽车的实现至关重要,因为它提供了快速响应和精确控制的能力,这是自动驾驶系统所必需的。 线控底盘由五大系统组成…...
css3D变换用法
文章目录 CSS3D变换详解及代码案例一、CSS3D变换的基本概念二、3D变换的开启与景深设置三、代码案例 CSS3D变换详解及代码案例 CSS3D变换是CSS3中引入的一种强大功能,它允许开发者在网页上创建三维空间中的动画和交互效果。通过CSS3D变换,你可以实现元素…...
Rust:启动与关闭线程
在 Rust 编程中,启动和关闭线程是并发编程的重要部分。Rust 提供了强大的线程支持,允许你轻松地创建和管理线程。下面将详细解释如何在 Rust 中启动和关闭线程。 启动线程 在 Rust 中,你可以使用标准库中的 std::thread 模块来创建和启动新…...
Ubuntu 的 ROS 2 操作系统安装与测试
引言 机器人操作系统(ROS, Robot Operating System)是一种广泛应用于机器人开发的开源框架,提供了丰富的库和工具,支持开发者快速构建、控制机器人并实现智能功能。 当前,ROS 2 的最新长期支持版本为 Humble Hawksbil…...
在双显示器环境中利用Sunshine与Moonlight实现游戏串流的同时与电脑其他任务互不干扰
我和老婆经常会同时需要操作家里的电脑,在周末老婆有时要用电脑加班上网办公,而我想在难得的周末好好地Game一下(在客厅用电视机或者平板串流),但是电脑只有一个,以往我一直都是把电脑让给老婆,…...
ElasticSearch备考 -- Cross cluster replication(CCR)
一、题目 操作在cluster1(local)中操作索引task,复制到cluster2(remote)中 二、思考 CCR 我们可以对标MySQL 理解为为主从,后者备份。主节点负责写入数据,从/备节点负责同步时主节点的数据。 …...
windows C#-异常处理
C# 程序员使用 try 块来对可能受异常影响的代码进行分区。 关联的 catch 块用于处理生成的任何异常。 finally 块包含无论 try 块中是否引发异常都会运行的代码,如发布 try 块中分配的资源。 try 块需要一个或多个关联的 catch 块或一个 finally 块,或两…...
边缘计算在智能制造中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 边缘计算在智能制造中的应用 边缘计算在智能制造中的应用 边缘计算在智能制造中的应用 引言 边缘计算概述 定义与原理 发展历程 …...
点云开发:从入门到精通的全面教程
简介 点云技术已成为计算机视觉、自动驾驶、3D重建等领域的重要组成部分。本教程旨在引导你从零基础开始学习点云开发,深入理解其背后的数学原理,并提供实用的开发技巧。 章节目录 点云技术概述 点云的定义及应用场景点云数据的来源和采集工具点云数据…...
网站顶部地图代码怎么做/中国百强城市榜单
参考文章 : 1.yarn资源memory与core计算配置 https://www.cnblogs.com/xjh713/p/9855238.html 2.cdh之调整YARN(调优yarn 生产必做优化项)004 https://blog.csdn.net/weixin_33788244/article/details/91669894 内存相关参数 我们在运行使…...
北京微信网站开发/怎样做企业宣传推广
本节书摘来自异步社区《像计算机科学家一样思考Python》一书中的第4章,第4.12节,作者[美]Allen B. Downey,赵普明 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。 4.12 练习 练习4-1 1.给函数polygon&…...
内蒙古网站制作/aso具体优化
那个百分十先生:Python操作Excel的Xlwings教程(五)zhuanlan.zhihu.com前几篇文章写的是关于Xlwings的相关知识,介绍了其相关API的使用方法,大家在使用Xlwing对Excel进行操作的时候,就可以使用推文中介绍的…...
番禺有经验的网站建设/网站优化的方法
在关系型数据库中,除前期对数据库的物理设计、关系规范化等方面进行优化外,一个简单直接有效的方法是对SQL语句进行调整,进行优化来减少计算量和内存需求,提高响应速度。本篇文章将讨论mysql如何优化where子句1.where条件的顺序(*…...
福田网站制作公司/企业网站seo推广方案
一、信息管理API osal_msg_allocate( )函数原型:任务是分配一个信息缓冲区,当任务调用或函数被调用时,该空间被信息填充或调用信息发送函数osal_msg_send() 发送缓冲空间的信息到其他任务,若该缓冲空间不能被分配,则设…...
技术支持 哈尔滨网站建设/seo排名关键词
在前面几节讲的都是 GPIO 的功能,本章我们会讲解如何修改和配置 CPU 的主频,了解 iMX6ULL 的时钟系统。15.1 i.MX6ULL 时钟系统 iMX6ULL 的系统主频为 528MHz,有些型号可以跑到 696MHz,但是默认情况下 iMX6ULL 的主频为396MHz。我…...