使用create_sql_query_chain工具根据自然语言问题生成SQL查询,踩坑版
1. 开启调试模式
from langchain import debugdebug = True # 启用调试模式
说明:
这里从 langchain
库中导入了一个名为 debug
的变量(或模块),然后将它设置为 True
。这通常用来启用调试模式,方便开发者在程序运行时看到更多内部日志和详细信息,便于排查问题。
举例:
如果你的程序出现异常或输出结果不符合预期,启用调试模式可以在控制台中打印出详细的调试日志,帮助你定位问题所在。
2. 导入其他必需模块
import getpass
import os
from langchain.chat_models import init_chat_model
# from langchain_core.prompts import PromptTemplate
# from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool
from dotenv import load_dotenv
from pyprojroot import here
from langchain.chains import create_sql_query_chain
from langchain_community.utilities import SQLDatabase
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
说明:
getpass
:用于安全地从用户处获取密码或敏感信息,不会在屏幕上回显输入内容。os
:用于操作系统相关的功能,例如环境变量读取和设置。init_chat_model
:从langchain.chat_models
导入,用来初始化聊天模型。load_dotenv
:用于加载项目根目录下的.env
文件,自动设置环境变量。here
:来自pyprojroot
库,用来确定项目根目录的路径。create_sql_query_chain
:用于根据自然语言问题生成SQL查询的链(Chain),注意这个工具用不同的模型来生成SQL语句时可能会返回不干净的SQL语句。SQLDatabase
:用于创建数据库对象,方便后续查询。StrOutputParser
:将模型输出解析成字符串。ChatPromptTemplate
:用于创建聊天风格的提示模板。
举例:
例如,通过 load_dotenv()
加载环境变量,你可以将 API 密钥放在 .env
文件中,避免硬编码在代码中。
3. 加载环境变量
load_dotenv()
说明:
这行代码会从当前目录(或项目根目录)下加载一个名为 .env
的文件,并将里面的变量设置为环境变量。这样我们就可以在代码中通过 os.environ
来访问这些变量。
举例:
如果你有一个 .env
文件,其中包含 GROQ_API_KEY=your_key_here
,调用 load_dotenv()
后,你可以直接通过 os.environ.get("GROQ_API_KEY")
获取这个值。
4. 获取 Groq API Key
# 如果没有设置 GROQ_API_KEY,则提示用户输入
if not os.environ.get("GROQ_API_KEY"):os.environ["GROQ_API_KEY"] = getpass.getpass("Enter API key for Groq: ")
说明:
这段代码判断环境变量中是否存在 GROQ_API_KEY
。如果没有找到,就调用 getpass.getpass()
来提示用户输入API密钥,并将输入的值设置到环境变量中。
举例:
当你第一次运行程序时,如果未在 .env
中设置 GROQ_API_KEY
,程序会暂停并提示“Enter API key for Groq:”,输入后就会将该值存入 os.environ
中,后续代码就能使用这个密钥了。
5. 定位并加载 SQLite 数据库
sqldb_directory = here("data/Chinook.db")
db = SQLDatabase.from_uri(f"sqlite:///{sqldb_directory}")
table_info = db.get_table_info(["Album"]) # 注意需要传递列表
print(f"\n Original table info: {table_info}")
输出:
说明:
here("data/Chinook.db")
:利用pyprojroot.here
方法定位项目中data
目录下的Chinook.db
文件,返回其绝对路径。SQLDatabase.from_uri(f"sqlite:///{sqldb_directory}")
:通过传入 SQLite 的 URI 构建一个 SQLDatabase 对象,用于后续的查询操作。db.get_table_info(["Album"])
:获取数据库中Album
表的详细信息,这里传入的是列表格式,因为该方法可能支持多个表一次查询。print(...)
:将获取到的表信息打印出来,便于调试和确认数据加载成功。
举例:
假设 Chinook.db
是一个包含音乐相关数据的数据库,Album
表记录了专辑信息。打印出来的信息可能包含专辑名称、发行年份等字段,方便后续构造查询问题。
6. 初始化 Llama 模型(使用 Groq 后端)
llm = init_chat_model("llama-3.3-70b-specdec", model_provider="groq", temperature=0)
说明:
这行代码调用 init_chat_model
初始化一个聊天模型。
- 参数
"llama-3.3-70b-specdec"
指定了模型名称,代表一种 Llama 模型的特定版本。 model_provider="groq"
表明该模型运行在 Groq 的后端上。temperature=0
表示模型的输出是确定性的(温度为0时,生成的内容不会有随机性),适合需要精确答案的场景。
举例:
当你向该模型提出问题时,由于温度为0,模型每次都会给出相同的回答,非常适合生成SQL查询这类需要准确答案的任务。
7. 创建生成SQL查询的链(Chain)
write_chain = create_sql_query_chain(llm, db)
response = write_chain.invoke({"question": "What name of MediaType is?"})
print(response,'\n')
说明:
create_sql_query_chain(llm, db)
:利用前面初始化的 LLM 和 数据库对象 创建一个“SQL查询链”。这个链负责将自然语言问题转换为 SQL 查询语句。write_chain.invoke({"question": "What name of MediaType is?"})
:调用该链,将问题(自然语言形式)传递进去,链内部会调用 LLM 根据数据库结构生成对应的 SQL 查询。- 打印返回的
response
,查看生成的SQL查询语句。
举例:
假设 MediaType
是数据库中的一个表或字段,该问题 可能 转换成类似 SELECT Name FROM MediaType
的 SQL 查询语句。程序将输出这个生成的查询。注意:这里用的是可能,为啥?因为有些模型会输出其他解释和重复问题的内容,这样的内容是不能直接执行的,必须得是干净的SQL语句,不然就报语法错误。
比如可能生成这种:红色圈出来的就是我们不想要的内容
8. 构建验证链:检查和修正SQL查询的错误
system = """Double check the user's {dialect} query for common mistakes, including:
- Only return SQL Query not anything else like ```sql ... ```
- Using NOT IN with NULL values
- Using UNION when UNION ALL should have been used
- Using BETWEEN for exclusive ranges
- Data type mismatch in predicates\
- Using the correct number of arguments for functions
- Casting to the correct data type
- Using the proper columns for joinsIf there are any of the above mistakes, rewrite the query.
If there are no mistakes, just reproduce the original query with no further commentary.Output the final SQL query only."""
说明:这里是重点,没有这个提示后面执行 create_sql_query_chain(llm, db)
输出结果会掉进坑里,本人已经掉过,还好,我爬起来了。
这段字符串定义了一个系统级别的提示(system prompt),用于检查和验证生成的 SQL 查询是否存在常见错误。提示内容中列出了几种常见的SQL错误(例如:使用 NOT IN
处理 NULL
、错误地使用 UNION
等),并要求如果发现错误则重写查询,否则直接输出原查询。
举例:
如果生成的SQL语句包含了多余的标记或格式错误,这个提示会要求模型对查询进行调整,确保最终输出的是纯 SQL 查询文本。
9. 构造聊天提示模板
prompt = ChatPromptTemplate.from_messages([("system", system), ("human", "{query}")]
).partial(dialect=db.dialect)
说明:
- 这里使用
ChatPromptTemplate.from_messages
创建了一个聊天式的提示模板,其中包含两部分消息:- 系统消息(system):上面定义的用于验证SQL查询的提示。
- 人类消息(human):包含占位符
{query}
,将由用户的问题替换。
.partial(dialect=db.dialect)
将数据库的方言信息(如 SQLite、MySQL 等)传递进去,使得提示中{dialect}
占位符可以被正确替换。
举例:
如果数据库是 SQLite,db.dialect
可能返回 "sqlite"
,那么在提示模板中 {dialect}
就会被替换为 "sqlite"
,确保模型知道当前使用的是哪种SQL语法。
10. 构建验证链
validation_chain = prompt | llm | StrOutputParser()
说明:
这行代码使用管道(|
)运算符将几个组件组合成一个验证链:
- 先通过
prompt
生成提示, - 再由 LLM 生成回复,
- 最后使用
StrOutputParser()
将回复解析为纯文本字符串。
整个链的作用就是对原生成的SQL查询进行验证和可能的重写。
举例:
例如,如果原SQL查询为 SELECT * FROM MediaType
,但存在语法问题,这个验证链可能会返回修改后的正确查询,如 SELECT Name FROM MediaType
。
11. 将生成SQL查询链和验证链组合成完整的链
full_chain = {"query": write_chain} | validation_chain
query = full_chain.invoke({"question": "What name of MediaType is?"}
)
print(query)
输出结果:
说明:
{"query": write_chain}
:这里将之前的生成SQL查询链(write_chain)包装成一个字典,其中键为"query"
,表示该链负责处理查询。- 然后使用管道运算符
|
将它与validation_chain
组合成一个完整的链。 - 最后,调用
full_chain.invoke(...)
,传入问题,整个链首先生成SQL查询,然后对生成的查询进行验证(如有错误则重写),最终输出经过验证的SQL语句。 - 打印最终的SQL查询。
举例:
整个过程:用户提问“MediaType的名称是什么?”
→ write_chain
根据问题和数据库信息生成SQL查询语句
→ validation_chain
检查查询语句是否存在语法或逻辑错误,并进行修正
→ 最终输出一个正确的SQL查询字符串,如 SELECT Name FROM MediaType;
。
12. 执行生成的SQL查询
db.run(query)
输出结果:
说明:
使用数据库对象 db
执行最终生成的SQL查询。
举例:
如果查询返回 SELECT Name FROM MediaType;
,则 db.run(query)
会连接到 Chinook.db
数据库,并执行该查询,返回结果。
总结
整段代码实现了以下工作流程:
- 初始化和配置:启用调试模式,加载环境变量和API密钥,定位数据库文件。
- 数据库连接:使用 SQLite 数据库
Chinook.db
,并获取表信息进行验证。 - 模型初始化:初始化一个基于 Llama 模型的聊天模型,并指定使用 Groq 后端。
- SQL查询链生成:利用自然语言问题生成SQL查询语句(例如“MediaType的名称是什么?”)。
- 验证与修正:对生成的SQL查询进行错误检查,修正常见问题,确保最终输出正确的SQL查询。
- 执行查询:将验证后的SQL查询发送给数据库执行,并返回查询结果。
实际应用场景举例:
如果你正在开发一个数据库管理工具,用户可以通过自然语言提问(如“列出所有专辑的名称”),系统将自动生成相应的SQL查询并返回结果。通过这种方式,非专业人士也可以通过简单的语言操作数据库,而不必掌握SQL语法。
最后给出完整代码:
import getpass
import os
from langchain.chat_models import init_chat_model
from langchain_core.prompts import PromptTemplate
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool
from dotenv import load_dotenv
from pyprojroot import here
from langchain.chains import create_sql_query_chain
from langchain_community.agent_toolkits import create_sql_agent
from langchain_community.agent_toolkits.sql.toolkit import SQLDatabaseToolkit
from langchain_community.utilities import SQLDatabaseload_dotenv()# 如果没有设置 GROQ_API_KEY,则提示用户输入
if not os.environ.get("GROQ_API_KEY"):os.environ["GROQ_API_KEY"] = getpass.getpass("Enter API key for Groq: ")sqldb_directory = here("data/Chinook.db")
db = SQLDatabase.from_uri(f"sqlite:///{sqldb_directory}")
table_info = db.get_table_info(["Album"]) # 注意需要传递列表
print(f"\n Original table info: {table_info}")# 初始化 Llama 模型,使用 Groq 后端
llm = init_chat_model("llama-3.3-70b-specdec", model_provider="groq", temperature=0)
# 定义自定义提示模板,用于生成 SQL 查询
custom_prompt = PromptTemplate(input_variables=["dialect", "input", "table_info", "top_k"],template="""You are a SQL expert using {dialect}.
Given the following table schema:
{table_info}
Generate a syntactically correct SQL query to answer the question: "{input}".
Limit the results to at most {top_k} rows.
Return only the SQL query without any additional commentary or Markdown formatting.
"""
)write_query = create_sql_query_chain(llm, db,prompt=custom_prompt)
# 构造输入数据字典,其中包含方言、表结构、问题和行数限制
input_data = {"dialect": db.dialect, # 数据库方言,如 "sqlite""table_info": db.get_table_info(), # 表结构信息"question": "What name of MediaType is?","top_k": 5
}# 调用链生成 SQL 查询,返回结果为一个字典,包含键 "query"
write_query_response = write_query.invoke(input_data)
print('\n write_query result:',write_query_response)#执行SQL语句
execute_query = QuerySQLDataBaseTool(db=db)
execute_response = execute_query.invoke(write_query_response)
print('\n execute_response result:',execute_response)#两个动作合起来搞成链
chain = write_query | execute_query
result_chain = chain.invoke(input_data)
print('\n result_chain==',result_chain)
相关文章:
使用create_sql_query_chain工具根据自然语言问题生成SQL查询,踩坑版
1. 开启调试模式 from langchain import debugdebug True # 启用调试模式说明: 这里从 langchain 库中导入了一个名为 debug 的变量(或模块),然后将它设置为 True。这通常用来启用调试模式,方便开发者在程序运行时看…...
DeepSeek本地部署+自主开发对话Web应用
文章目录 引言前端部分核心页面DeepSeek.vueMyModal.vue 后端部分WebSocketConfig 配置类AbstractDeepSeekToolDeepSeekWebSocketHandler 数据库设计总结 引言 最近DeepSeep横空出世,在全球内掀起一股热潮,到处都是满血大模型接入的应用,但这…...
【Springboot】解决问题 o.s.web.servlet.PageNotFound : No mapping for *
使用 cursor 进行老项目更新为 springboot 的 web 项目,发生了奇怪的问题,就是 html 文件访问正常,但是静态文件就是 404 检查了各种配置,各种比较,各种调试,最后放弃时候,清理没用的配置文件&…...
微信小程序点击按钮,将图片下载到本地
前言: 最近在公司完成一个小程序的时候需要实现一个功能:点击按钮获取用户相册权限,将图片下载到用户本地相册,经过了好几次的尝试最终算是实现了。将总结的经验在这里分享给小伙伴们。 实现方式: //.wxml文件 <…...
解锁网络防御新思维:D3FEND 五大策略如何对抗 ATTCK
D3FEND 简介 背景介绍 2021年6月22日(美国时间),美国MITRE公司正式发布了D3FEND——一个网络安全对策知识图谱。该项目由美国国家安全局(NSA)资助,并由MITRE的国家安全工程中心(NSECÿ…...
架构案例:从初创互联网公司到分布式存储与反应式编程框架的架构设计
文章目录 引言一、初创互联网公司架构演化案例1. 万级日订单级别架构2. 十万级日订单级别架构3. 百万级日订单级别架构 二、分布式存储系统 Doris 架构案例三、反应式编程框架架构案例总结 引言 分布式架构 今天我们将探讨三种不同类型的架构案例,分别探讨 一个初…...
Redis数据结构-List列表
1.List列表 列表类型适用于存储多个有序的字符串(这里的有序指的是强调数据排列顺序的重要,不是升序降序的意思),列表中的每个字符串称为元素(element),一个列表最多可以存储2^32-1个元素。在R…...
开启AI短剧新纪元!SkyReels-V1/A1双剑合璧!昆仑万维开源首个面向AI短剧的视频生成模型
论文链接:https://arxiv.org/abs/2502.10841 项目链接:https://skyworkai.github.io/skyreels-a1.github.io/ Demo链接:https://www.skyreels.ai/ 开源地址:https://github.com/SkyworkAI/SkyReels-A1 https://github.com/Skywork…...
mac安装环境
minconda https://docs.anaconda.net.cn/miniconda/install/ 注意在下载下来应该有100多兆,太大了应该是完整版,我们不需要 jdk 镜像网站下载设置环境变量: 终端:sudo vim ~/.zshrc # JDK Config JAVA_HOME/Library/Java/Java…...
js加密之延伸requestAnimationFrame
简言 上篇文章有提到requestAnimationFrame,只是随笔带过。这篇文章就着重研究一下requestAnimationFrame的运用,以及实际作用。还有关于在js加密技术中的落地实现可行性。 功能说明 小声说一下,做开发的同学一定要学会翻官方文档,我这里直接引用一段官方介绍。 …...
SpringBoot @Value 注解使用
Value 注解用于将配置文件中的属性值注入到Spring管理的Bean中。 1. 基本用法 Value 可以直接注入配置文件中的属性值。 配置文件 (application.properties 或 application.yml) 配置文件定义需要注入的数据。 consumer:username: lisiage: 23hobby: sing,read,sleepsubje…...
JavaFunction的使用
一、基础概念与核心方法 定义与作用 Function<T, R> 是一个函数式接口,接收类型为 T 的输入参数,返回类型为 R 的结果。其核心方法为 apply(T t)。例如,将字符串转换为整数长度: java Function<String, Integer>…...
TVbox蜂蜜影视:智能电视观影新选择,简洁界面与强大功能兼具
蜂蜜影视是一款基于猫影视开源项目 CatVodTVJarLoader 开发的智能电视软件,专为追求简洁与高效观影体验的用户设计。该软件从零开始编写,界面清爽,操作流畅,特别适合在智能电视上使用。其最大的亮点在于能够自动跳过失效的播放地址…...
Python基于交互注意力的深度时空网络融合多源信息的剩余寿命预测方法
基于交互注意力的深度时空网络融合多源信息的剩余寿命预测方法 一、方法框架设计 本方法的核心思想是通过交互注意力机制动态捕捉多源数据间的跨模态关联,并结合深度时空网络建模序列的时空退化特征。 1. 多源特征编码器 输入:传感器数据、工况参数、…...
阿里云 | 快速在网站上增加一个AI助手
创建智能体应用 如上所示,登录阿里云百炼人工智能业务控制台,创建智能体应用,智能体应用是一个agent,即提供个人或者企业的代理或中间件组件应用,对接阿里云大模型公共平台,为个人或者企业用户提供大模型应…...
基于Electron的应用程序安全测试基础 — 提取和分析.asar文件的案例研究
目录: 4.4. 案例研究 4.4.2. 情况描述 4.4.3. 信息收集 4.4.3.2. 检查隐藏目录(点目录)的可能性 4.4.3.3. 使用 DB Browser for SQLite 打开 .db 文件 4.4.3.4. 寻找加密算法 4.4.3.5. 找到加密算法 4.4.3.6. 理解加密流程 4.4.3.7. 找到“Ke…...
Vue3生命周期以及与Vue2的区别
文章目录 一、Vue3生命周期核心阶段与钩子函数二、Vue3生命周期示例:选项式 vs 组合式 API选项式 API 示例(Vue2)组合式 API 示例(Vue3) 三、Vue3与Vue2生命周期的核心差异1. 钩子函数更名2. 组合式 API 的影响3. 新增…...
windows下安装CUDA-本地微调大模型
1、查看NVIDIA的控制面板的版本号 2 下载CUDA Toolkit https://developer.nvidia.com/cuda-toolkit-archive 这里要下载和自己电脑NVIDIA适配CUDA的大版本要保持一致 选择对应的版本进行下载 文件比较大,直接右键复制链接,放到迅雷中两分钟就下好了 3 …...
LeetCode:132. 分割回文串 II(DP Java)
目录 132. 分割回文串 II 题目描述: 实现代码与解析: DP 原理思路: 132. 分割回文串 II 题目描述: 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。 返回符合要求的 最少分割次数…...
C# 13与.NET 9革新及工业开发应用
摘要 微软推出的C# 13与.NET 9以“高效且智能”为导向,具备扩展类型、半自动属性、锁对象优化等十大革新。本文深入剖析新特性于工业级开发的应用场景,包含性能优化策略、AI集成方案以及EF Core实战技巧,为开发者提供从理论到实践的完整指引…...
IPoIB源码深度解析:如何基于TCP/IP协议栈实现高性能InfiniBand通信
一、IPoIB的核心设计理念 IPoIB(IP over InfiniBand)是一种在InfiniBand网络上承载IP流量的技术,其核心目标是在不修改上层应用的前提下,利用InfiniBand的高带宽和低延迟特性。与自定义协议栈不同,IPoIB通过深度集成到Linux内核TCP/IP协议栈中,将InfiniBand设备抽象为标…...
《白帽子讲 Web 安全:点击劫持》
目录 摘要: 一、点击劫持概述 二、点击劫持的实现示例:诱导用户收藏指定淘宝商品 案例 构建恶意页面: 设置绝对定位和z - index: 控制透明度: 三、其他相关攻击技术 3.1图片覆盖攻击与 XSIO 3.2拖拽劫持与数据…...
PostgreSQL10 逻辑复制实战:构建高可用数据同步架构!
PostgreSQL10 逻辑复制实战:打造高可用数据同步架构! 概述 PostgreSQL 10 引入了逻辑复制(Logical Replication),为数据库高可用和数据同步提供了更灵活的选择。PostgreSQL 复制机制主要分为物理复制和逻辑复制两种&…...
Spring Boot 异步编程深入剖析
Spring Boot 异步编程深入剖析 1. 异步方法的使用 原理深度解析 Spring Boot 的异步方法基于 Spring 的 AOP(面向切面编程)实现。当在方法上添加 Async 注解时,Spring 会为该方法所在的类创建一个代理对象。当调用该异步方法时,…...
《动手学习深度学习》的笔记,将会持续更新。
1.什么是机器学习? 机器学习是:换句话说,我们用数据训练(train)模型。 数据不断的训练出比较好的模型。 1.2 机器学习的关键零件 1.学习的数据。 2. 如何转换数据的模型。 3.一个目标函数。 4.调整模型参数以优化目标函数的算法。 1,数据有什么组成? 数据=样本+…...
[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解
一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…...
VUE3+Vite使用TailwindCSS【若依前后端分离框架】
参考:https://tailwind.nodejs.cn/docs/guides/vite#vue 和 https://blog.csdn.net/hjl_and_djj/article/details/144694485依次运行命令: cnpm install -D tailwindcss3.4.17 postcss autoprefixernpx tailwindcss init -p修改配置文件tailwind.config.…...
【Linux文件IO】系统IO详情
目录 一、前言 二、相关API介绍 2.1 open 2.2 read 2.3 write 2.4 lseek 2.5 close 三、简单示例 3.1 示例1 3.2 示例2 一、前言 在 Linux 系统编程中,系统 I/O(又称低级 I/O)是直接通过操作系统提供的系统调用实现的文件操作接口…...
【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术
弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术 1.弹性裸金属技术背景1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失1.2 传统 KVM 虚拟化系统导致资源争抢不可避免1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈 2.弹性裸金属技术实现2.1 VPC…...
(贪心 合并区间)leetcode 56
思路来源:代码随想录--代码随想录_合并区间题解 首先用lambda 按照左界值升序排序 建立答案的二维数组,将第一个行区间放入,判断从第二行开始 第i行的左区间一定大于第i-1行的左区间(排序过了),所以只判断…...
如何理解语言模型
统计语言模型 先看语言模型,语言即自然语言,模型及我们要解决的某个任务。 任务一:判断哪句话出现的概率大 任务二:预判空缺的位置最有可能是哪个词 再看统计,统计即解决上述两个任务的解决方法。先对语句进行分词…...
动态规划/贪心算法
一、动态规划 动态规划 是一种用于解决优化问题的算法设计技术,尤其适用于具有重叠子问题和最优子结构性质的问题。它通过将复杂问题分解为更简单的子问题,并保存这些子问题的解以避免重复计算,从而提高效率。 动态规划的核心思想 最优子结…...
Hadoop简介
1. Hadoop简介 官网:http://hadoop.apache.org 1.1 Hadoop架构 Hadoop由三个模块组成:分布式存储HDFS、分布式计算MapReduce、资源调度引擎YARN 1.2 Hadoop历史 Hadoop作者Doug Cutting Apache Lucene是一个文本搜索系统库 Apache Nutch作为前者的一部…...
Vscode 便用快捷键设置教程
文章目录 简介:1. go to define (跳转到函数定义的位置)2. go to declaration (跳转到函数声明的位置)3. move line (上下移动本行代码)3.1上下复制本行代码 4. 前进和后退(就是前进到光标上一次停留的位置,和后退到那…...
数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表
一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 :“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令 命令解释 SHOW DATABASES; 展示所有的数据库 CREATE DATABASE 数据…...
水滴tabbar canvas实现思路
废话不多说之间看效果图,只要解决了这个效果水滴tabbar就能做出来了 源码地址 一、核心实现步骤分解 布局结构搭建 使用 作为绘制容器 设置 width=600, height=200 基础尺寸 通过 JS 动态计算实际尺寸(适配高清屏) function initCanvas() {// 获取设备像素比(解决 Re…...
windows安装vue
1、下载nodejs安装包 https://nodejs.cn/download/ 2、安装node 中途记得可以自己改安装路径,其他都是下一步 3、安装完成后检查 node -v :查看nodejs的版本 npm -v :查看npm的版本 4、修改npm默认安装目录与缓存日志目录的位置 在nodejs目…...
使用3090显卡部署Wan2.1生成视频
layout: post title: 使用3090显卡部署Wan2.1生成视频 catalog: true tag: [Kubernetes, GPU, AI] 使用3090显卡部署Wan2.1生成视频 1. 环境说明2. 模型下载3. 克隆仓库4. 安装依赖5. 生成视频 5.1. 使用generate脚本生成5.2. 使用gradio启动UI界面生成 5.2.1. 启动gradio服务5…...
DCN讲解
DCN是DeepFM的升级版,后者是只能做二阶交叉特征,随着阶数上升,模型复杂度大幅提高,且FM网络层较浅,表达能力有限。google团队通过构建深度交叉网络来自动进行特征的高阶交叉,且时空复杂度均为线性增长&…...
ARM 架构下 cache 一致性问题整理
本篇文章主要整理 ARM 架构下,和 Cache 一致性相关的一些知识。 本文假设读者具备一定的计算机体系结构和 Cache 相关基础知识,适合有相关背景的读者阅读 1、引言 简单介绍一下 Cache 和内存之间的关系 在使能 Cache 的情况下,CPU 每次获取数…...
算法-二分查找
二分查找 其实二分查找是一个很简单理解的东西,从他的名字就可以看出,就是要分为两段去查找一个元素 我们确定一个中间元素,然后将这一个元素和左边的部分和右边的部分做对比 然后根据实际情况来选择一个部分来继续做这么一个步骤 直到找…...
Python Cookbook-2.24 在 Mac OSX平台上统计PDF文档的页数
任务 你的计算机运行着比较新的MacOSX系统(10.3的“Panther”或更新的版本),现在需要知道一个 PDF 文档的页数。 解决方案 PDF格式和 Python都已经集成到了Mac OsX系统中(10.3或更高版本),因而这个问题解决起来也相对比较容易: #!/usr/bin python im…...
【MySQL】索引(页目录、B+树)
文章目录 1. 引入索引2. MySQL与磁盘交互的基本单位3. 索引的理解3.1 页目录3.2 B树 4. 聚簇索引、非聚簇索引5. 索引的操作5.1 索引的创建5.1.1 创建主键索引5.1.2 创建唯一索引5.1.3 普通索引的创建5.1.4 全文索引的创建 5.2 索引的查询5.3 删除索引 1. 引入索引 索引&#…...
工业AR眼镜的‘芯’动力:FPC让制造更智能【新立电子】
随着增强现实(AR)技术的快速发展,工业AR智能眼镜也正逐步成为制造业领域的重要工具。它不仅为现场工作人员提供了视觉辅助,还极大地提升了远程协助的效率、优化了仓储管理。FPC在AI眼镜中的应用,为工业AR智能眼镜提供了…...
开启mysql的binlog日志
mysql版本5.7 1.查看是否开启bin_log show global variables like’log_bin’; off的话需要先开启 在mysql的文件夹目录中找到my.ini 加一行log-bin“C:/ProgramData/MySQL/MySQL Server 5.7/logs/log-bin” 并提前创建好目录 2.数据库会把日志放进logs目录中 3.查看log日…...
SpringSecurity基于JWT实现Token的处理
前面介绍了手写单点登录和JWT的应用,本文结合SpringSecurity来介绍下在SpringBoot项目中基于SpringSecurity作为认证授权框架的情况下如何整合JWT来实现Token的处理。 一、认证思路分析 SpringSecurity主要是通过过滤器来实现功能的!我们要找到SpringSecurity实现认证和校验…...
数据结构与算法-图论-最短路-floyd扩展
floyd和它的拓展: 在计算机科学领域,Floyd通常指Floyd Warshall算法,由罗伯特弗洛伊德(Robert W. Floyd)提出,这是一种用于在加权有向图中查找所有顶点对之间最短路径的算法。 算法原理 Floyd Warsha…...
c++中所有构造函数的介绍与使用
C 中,构造函数是一种特殊的成员函数,用于在创建对象时对对象进行初始化。C 中有多种类型的构造函数,下面详细介绍这些构造函数及其特点和使用场景。 1. 默认构造函数 定义:默认构造函数是指在没有提供任何参数的情况下可以被调用…...
力扣1584. 连接所有点的最小费用
力扣1584. 连接所有点的最小费用 题目 题目解析及思路 题目要求返回最小生成树 最小生成树模版题 法一:prim 主要思想是每次找离树最近的顶点,将其加入树种,并更新其他所有点到该点的距离 代码 class Solution { public:int minCostCo…...
FPGA开发,使用Deepseek V3还是R1(8):FPGA的全流程(简略版)
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...