Neon

1- Neon 平台概述

Neon 是一个无服务器 PostgreSQL 平台,通过将计算与存储分离,提供自动扩展、数据库分支和点时间还原等功能,旨在帮助开发者快速构建可靠、可扩展的应用。(cite3†Neon Docs)

Neon平台概览

图:Neon 平台概览

1.1- Neon 核心优势

  • 无服务器架构:按需自动扩展,无需手动管理服务器
  • 数据库分支:像 Git 一样创建数据库分支,便于开发和测试
  • 存储与计算分离:优化资源使用,降低成本
  • 即时扩展:根据工作负载自动调整计算资源
  • 点时间恢复:随时回滚到任意时间点
  • 慷慨的免费计划:提供足够的资源用于开发和小型应用

1.2- Neon 与传统 PostgreSQL 对比

特性 Neon 传统 PostgreSQL
服务器管理 无需管理 需要手动管理
扩展性 自动扩展 需要手动扩展
存储计算 分离 耦合
数据库分支 支持 不支持
空闲成本 几乎为零 持续产生费用
点时间恢复 内置支持 需要额外配置

表:Neon 与传统 PostgreSQL 对比

1.3- Neon 性能对比

以下是 Neon 与其他数据库服务的性能对比数据:

指标 Neon 传统托管 PostgreSQL 自托管 PostgreSQL
启动时间 < 1秒 1-2分钟 3-5分钟
自动扩展响应时间 秒级 分钟级 手动配置
存储成本 按使用付费 固定配置 预置容量
空闲资源成本 接近零 全额付费 全额付费
数据库分支创建 秒级 不支持 不支持
点时间恢复 即时 小时级 取决于备份策略

表:Neon 性能对比数据


2- Neon 架构图示

为了直观展示 Neon 的架构,下面给出几个示例图表:

2.1- 计算与存储分离架构

graph TD
    A[用户请求] -->|API调用| B[计算层]
    B -->|执行SQL查询| C[存储层]
    C -->|返回数据| B
    B -->|响应结果| A

图 1. Neon 计算层与存储层分离架构示意图

2.2- 数据库分支工作流

graph LR
    P[生产环境数据库]
    D[开发分支]
    T[测试分支]
    P --- D
    P --- T

图 2. Neon 数据库分支工作流示意图

2.3- Neon 系统架构详解

Neon系统架构

图 3. Neon 系统架构详解

在这个架构中:

  • Compute Nodes:处理查询请求,可以根据需求自动扩展
  • Storage Layer:使用分布式存储系统,支持数据分支和时间点恢复
  • Control Plane:管理整个系统的资源分配和调度
  • API Gateway:提供统一的接口供客户端访问

3- 实际操作演示

下面以几个常见场景为例,详细展示如何在 Neon 平台上进行操作。

3.1- 注册与创建数据库

  1. 注册账户
    访问 Neon 控制台 进行注册,注册后登录 Neon Console。(cite50†generous free plan)

    Neon注册页面

    图:Neon 注册页面

  2. 创建项目
    在控制台中点击 “创建项目”,填写项目名称和区域,然后系统会自动完成数据库实例的部署。

    创建Neon项目

    图:创建 Neon 项目

  3. 获取连接信息
    项目创建完成后,你可以在控制台中查看数据库连接信息,包括连接字符串、主机名、端口等。

    连接信息

    图:数据库连接信息

  4. 使用 SQL 编辑器
    Neon 提供了内置的 SQL 编辑器,可以直接在浏览器中执行 SQL 查询。

    SQL编辑器

    图:Neon SQL 编辑器


3.2- 使用 Neon CLI 管理数据库

Neon 提供命令行工具(CLI)以便开发者在终端中完成各项操作。下面是一个基于 CLI 的操作示例:

  1. 安装 Neon CLI
    Neon 官方提供了名为 neonctl 的命令行工具:

    npm install -g neonctl
    

    安装Neon CLI

    图:安装 Neon CLI

  2. 登录 Neon

    neonctl auth
    

    系统会提示你输入 API 密钥或跳转至浏览器完成授权。API 密钥可以在 Neon 控制台的个人设置中生成。

    Neon API密钥

    图:生成 Neon API 密钥

  3. 列出项目

    neonctl projects
    
  4. 创建新的分支

    neonctl branches create --project-id <project-id> --name dev
    
  5. 列出分支

    neonctl branches --project-id <project-id>
    
  6. 连接到数据库

    neonctl connection-string --project-id <project-id> --branch <branch-name>
    

    Neon CLI操作

    图:使用 Neon CLI 管理数据库


3.3- 数据库连接与代码示例

3.3.1- Node.js 连接示例

下面以 Node.js 为例展示如何连接 Neon PostgreSQL 数据库:

  1. 安装 PostgreSQL 客户端

    npm install pg
    
  2. 连接数据库示例代码

    const { Client } = require('pg');
    
    // 从环境变量中获取 Neon 数据库连接串
    const client = new Client({
      connectionString: process.env.NEON_DATABASE_URL,
      ssl: {
        rejectUnauthorized: false // Neon 需要 SSL 连接
      }
    });
    
    async function main() {
      try {
        await client.connect();
        console.log('成功连接到 Neon 数据库');
        
        const result = await client.query('SELECT NOW() as current_time');
        console.log('当前时间:', result.rows[0].current_time);
        
        // 创建表示例
        await client.query(`
          CREATE TABLE IF NOT EXISTS users (
            id SERIAL PRIMARY KEY,
            name VARCHAR(100) NOT NULL,
            email VARCHAR(100) UNIQUE NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
          )
        `);
        console.log('用户表创建成功');
        
        // 插入数据示例
        const insertResult = await client.query(
          'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *',
          ['张三', '[email protected]']
        );
        console.log('插入用户:', insertResult.rows[0]);
        
      } catch (err) {
        console.error('数据库操作失败:', err);
      } finally {
        await client.end();
      }
    }
    
    main();
    

    Node.js连接Neon

    图:Node.js 连接 Neon 数据库

3.3.2- Python 连接示例

# 安装依赖: pip install psycopg2-binary python-dotenv

import os
import psycopg2
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 获取数据库连接信息
db_url = os.getenv("NEON_DATABASE_URL")

# 连接到数据库
conn = psycopg2.connect(db_url)

try:
    # 创建游标
    with conn.cursor() as cur:
        # 查询当前时间
        cur.execute("SELECT NOW()")
        current_time = cur.fetchone()[0]
        print(f"当前时间: {current_time}")
        
        # 创建表
        cur.execute("""
        CREATE TABLE IF NOT EXISTS products (
            id SERIAL PRIMARY KEY,
            name VARCHAR(100) NOT NULL,
            price DECIMAL(10, 2) NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
        """)
        conn.commit()
        print("产品表创建成功")
        
        # 插入数据
        cur.execute(
            "INSERT INTO products (name, price) VALUES (%s, %s) RETURNING *",
            ("智能手机", 3999.99)
        )
        product = cur.fetchone()
        conn.commit()
        print(f"插入产品: ID={product[0]}, 名称={product[1]}, 价格={product[2]}")
        
finally:
    # 关闭连接
    conn.close()

Python连接Neon

图:Python 连接 Neon 数据库

3.3.3- 使用 Prisma ORM 连接 Neon

对于 TypeScript/JavaScript 开发者,Prisma 是一个流行的 ORM 工具,可以轻松连接 Neon:

  1. 安装 Prisma

    npm install prisma @prisma/client
    npx prisma init
    
  2. 配置 Prisma 连接

    .env 文件中添加:

    DATABASE_URL="postgresql://user:password@hostname:port/database?sslmode=require"
    
  3. 创建 Prisma 模型

    prisma/schema.prisma 文件中