nextJs连接自己的PgSql数据库[简单版]

NextJs官方教程 第6章,设置数据库章节,不使用vercel,改用自己的数据库

【官方文档】Learn Next.js: Setting Up Your Database | Next.js

官方教程在第6章设置数据库时,使用了vercel数据库,同时使用了@vercel/postgres库,但是可能由于网络问题导致问题,其次 vercel 提供的数据库过小,所以考虑连接自己服务器的库。

安装PgSQL

首先在服务器安装,我使用docker compose,可参考docker hub调整配置

# Use postgres/example user/password credentials
version: '3.9'

services:
  db:
    image: postgres
    restart: always
    # set shared memory limit when using docker-compose
    shm_size: 128mb
    # or set shared memory limit when deploy via swarm stack
    #volumes:
    #  - type: tmpfs
    #    target: /dev/shm
    #    tmpfs:
    #      size: 134217728 # 128*2^20 bytes = 128Mb
    environment:
      POSTGRES_PASSWORD: Ywj@0715
      POSTGRES_DB: nextjs  
      POSTGRES_USER: ywj
    ports:  
      - "5432:5432"  
    volumes:  
      - ./data:/var/lib/postgresql/data  
      
  pgadmin:  
    image: dpage/pgadmin4
    container_name: pgadmin4 
    environment:
      PGADMIN_DEFAULT_EMAIL: "ywj@yangood.top"
      PGADMIN_DEFAULT_PASSWORD: "123456"
    ports:  
      - "3005:80"  
    depends_on:  
      - db

安装完后注意修改为本地可连接,修改pg_hba.conf令外部可访问。

安装pg库

回到nextjs项目,我们执行 pnpm i pg 安装pg库来连接自己的服务器。

编写sql方法

由于不能直接使用vercel的pg库,我们创建自己的方法 pg.ts,以下是简单仿写pg实现,减少代码改动。

注意 .env 环境变量中需设置以下内容

POSTGRES_USER="ywj"
POSTGRES_PASSWORD="ywjpwd"
POSTGRES_HOST="xxx.xxx.xxx.xxx"
PGSQL_PORT="5432"
POSTGRES_DATABASE="nextjs"
import { QueryResult } from "@vercel/postgres";
import { Pool } from "pg";

const pool = new Pool({
  user: process.env.POSTGRES_USER,
  password: process.env.POSTGRES_PASSWORD,
  host: process.env.POSTGRES_HOST,
  port: Number.parseInt(process.env.PGSQL_PORT as string),
  database: process.env.POSTGRES_DATABASE,
});

class MyPgClient {

  pool: Pool;

  constructor(pool: Pool) {
    this.pool = pool;
  }

  async sql<T extends QueryResultRow>(
    queryTemplate: TemplateStringsArray,
    ...values: (string | number | Date | null | undefined)[]
  ): Promise<QueryResult<T>> {

    const sqlString = queryTemplate.reduce(
      (acc, str, i) => acc + (i === 0 ? str : `$${i} ` + str),
      ''
    );

    try {
      const res: QueryResult<T> = await pool.query({ text: sqlString, values });
      return res as QueryResult<T>;
    } catch (error) {
      console.error('Error executing query:', error);
      throw error;
    }
  }
}

const client = new MyPgClient(pool);

async function sql<T extends QueryResultRow>(
  queryTemplate: TemplateStringsArray,
    ...values: (string | number | Date | null | undefined)[]
): Promise<QueryResult<T>> {
  return client.sql(queryTemplate, ...values)
}

export { pool, sql, client };

最后调整

替换 /app/seed/route.ts 中的代码

// import { db } from '@vercel/postgres';
import { client } from '@/app/scripts/pg';

替换 /app/lib/data.ts 中的代码

// import { sql } from '@vercel/postgres';
import { sql } from '@/app/scripts/pg';

完成!可以继续进行教程中的seed步骤。

效果图

以下是我执行seed后效果图,可以看到执行成功,且数据已经入库。
在这里插入图片描述

seed后pg表已经写入
面板查询如图。
在这里插入图片描述
希望能给到初学者一些帮助。

### 配置 PostgreSQL 的用户、密码、主机和端口等连接参数 为了正确设置 PostgreSQL 数据库连接参数,可以通过环境变量或直接在应用程序中传递这些参数来实现。以下是详细的说明: #### 设置环境变量 通过设置环境变量的方式可以简化数据库连接过程。常用的环境变量包括 `PGHOST`、`PGPORT`、`PGUSER` 和 `PGDATABASE`,分别用于定义数据库的主机地址、端口号、用户名以及要连接数据库名称。 例如,在 Linux 或 macOS 中,可以使用以下命令设置这些变量: ```bash export PGHOST="localhost" export PGPORT="5432" export PGUSER="your_username" export PGDATABASE="your_database_name" ``` 上述命令设置了基本的连接参数[^2]。如果需要进一步增强安全性并启用 SSL 加密通信,则还可以配置额外的 SSL 参数,比如 `sslcert` 和 `sslkey` 文件路径[^3]。 #### 在 Python 应用程序中显式提供连接参数 除了依赖于操作系统级别的环境变量外,也可以直接在编程语言(如 Python)里指定所有的必要选项。下面是一个利用 psycopg2 库作为例子展示如何构建完整的连接字符串或者字典形式传入所需的信息片段: ```python import psycopg2 conn = psycopg2.connect( host='localhost', port=5432, user='your_username', password='your_password', # 密码需自行设定 dbname='your_database_name' ) cursor = conn.cursor() # 执行查询操作... cursor.close() conn.close() ``` 这段代码展示了如何手动输入各字段值创建到目标实例上的链接对象[^1]。注意这里并未涉及任何外部存储机制;所有细节均硬编码至脚本内部以便快速测试目的为主。 另外关于数据安全方面考虑的话,应该遵循最佳实践原则——即仅授予最低权限给应用层面对应角色,并定期审查审计日志记录活动情况以防止潜在威胁发生的同时维护良好的备份策略确保业务连续性不受影响[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值