TypeORM 0.3.20升级:替换createConnection为DataSource遇阻,表未生成
完整修改方案(TypeORM 0.3.20 + Fastify)
1. 修复数据源初始化代码(/decorators/db.ts)
核心问题是你创建了DataSource但未调用initialize()方法,且未正确读取环境变量配置。替换为以下完整代码:
import fp from "fastify-plugin"; import { DataSource } from "typeorm"; import { Memo } from "../modules/memo/entity"; export default fp(async (fastify) => { try { // 从.env读取数据库配置,与你的环境变量对应 const dataSource = new DataSource({ type: "postgres", host: process.env.TYPEORM_HOST, port: parseInt(process.env.TYPEORM_PORT || "5432"), username: process.env.TYPEORM_USERNAME, password: process.env.TYPEORM_PASSWORD, database: process.env.TYPEORM_DATABASE, // 开发环境自动同步实体到数据库(生产环境建议用迁移) synchronize: process.env.TYPEORM_SYNCHRONIZE === "true", // 直接引入实体类,避免路径匹配的潜在问题 entities: [Memo], // 若要保留路径匹配,需确保路径正确(开发用src/,构建后用dist/) // entities: [process.env.TYPEORM_ENTITIES || "src/modules/*/entity.ts"], }); // 关键步骤:初始化数据源,这一步才会连接数据库并生成表 await dataSource.initialize(); console.log("数据库连接成功,实体同步完成"); // 给Fastify挂载数据库仓库 fastify.decorate("db", { memo: dataSource.getRepository(Memo), }); // 服务器关闭时自动释放数据源连接 fastify.addHook("onClose", async () => { await dataSource.destroy(); }); } catch (error) { console.error("数据库连接失败:", error); throw error; // 抛出错误终止服务,避免无效运行 } });
2. 确保环境变量正确加载
如果项目未配置dotenv,需在index.ts顶部添加环境变量加载逻辑:
import dotenv from "dotenv"; dotenv.config();
未安装dotenv的话先执行:npm install dotenv --save
3. 验证实体与配置
- 你的
Memo实体代码无问题,@Entity()未指定表名时,会自动以类名小写生成表(即memo) - 确认
.env中TYPEORM_SYNCHRONIZE=true已正确设置,该开关控制实体同步到数据库的行为
4. 问题根源说明
- 未调用
dataSource.initialize():DataSource创建后必须初始化才会执行数据库连接和表同步 - 环境变量未正确加载:导致数据库配置失效或
synchronize未开启 - 旧API
getConnectionOptions()已废弃,无法适配新的DataSource体系
测试步骤
- 安装依赖(若未装
dotenv):npm install dotenv - 修改代码后重启服务:
npm start - 查看控制台输出,确认出现"数据库连接成功,实体同步完成"
- 进入PostgreSQL数据库,执行
SELECT * FROM memo;验证表是否生成
内容的提问来源于stack exchange,提问作者TaeGeunLee
相关产品推荐
相关产品推荐

