Node.js 如何导入.sql文件并将其内容用于SQL查询执行
Node.js导入.sql文件调用的实现方案
你提的需求完全可以落地,以下是不同场景下的可执行方案:
1. 原生Node.js(无构建工具)场景
直接用Node内置的fs模块读取SQL文件即可,可封装为通用工具函数使用:
CommonJS 版本
const fs = require('fs/promises'); const path = require('path'); // 传入SQL文件名,返回文件内容字符串 async function loadSql(fileName) { // 这里的./sql是你存放所有SQL文件的目录,可根据项目结构调整 const filePath = path.resolve(__dirname, './sql', fileName); return await fs.readFile(filePath, 'utf-8'); } // 业务代码中调用 const getUsersSql = await loadSql('get_users.sql'); orm.execute(getUsersSql);
ESM 版本
import { readFile } from 'fs/promises'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); async function loadSql(fileName) { const filePath = join(__dirname, 'sql', fileName); return readFile(filePath, 'utf-8'); }
2. 带构建工具(Webpack/Vite/Rollup)场景
可以通过配置loader/plugin实现你示例中的直接import写法:
Webpack 配置
首先安装raw-loader依赖,然后在webpack配置中新增规则:
module.exports = { module: { rules: [ { test: /\.sql$/i, use: 'raw-loader', }, ], }, };
配置完成后就可以直接用如下写法导入:
import sql from './my_query.sql'; orm.execute(sql);
Vite 配置
Vite内置了静态资源raw导入能力,无需额外安装依赖,导入时加?raw后缀即可:
import sql from './my_query.sql?raw'; orm.execute(sql);
3. TypeScript 类型适配
如果使用TypeScript开发,需要新增类型声明让TS识别.sql模块,在项目的全局类型声明文件(如custom.d.ts、env.d.ts)中加入如下代码:
declare module '*.sql' { const content: string; export default content; }
如果是Vite的?raw导入方式,Vite已经内置了对应类型,无需额外声明。
注意事项
- 所有SQL文件统一使用UTF-8编码,避免读取时出现乱码
- 涉及动态参数的SQL不要手动拼接字符串,使用ORM自带的参数绑定能力,避免SQL注入风险
内容的提问来源于stack exchange,提问作者lpetrucci
相关产品推荐
相关产品推荐

