You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在DigitalOcean无服务器函数部署Go语言CRUD遇SQLite3依赖错误求助

在DigitalOcean无服务器函数中使用SQLite3构建CRUD的问题解决

一、先解决构建失败的依赖问题

你的部署错误核心是远程构建环境找不到SQLite3的Go依赖,因为函数目录缺少go.mod和go.sum文件,Go模块无法解析依赖。执行以下步骤修复:

  1. 进入存放db.go的blog/db函数目录
  2. 生成模块文件:
    go mod init blog/db
    
  3. 添加SQLite3依赖并生成校验文件:
    go get github.com/mattn/go-sqlite3
    
  4. 重新执行部署命令:
    doctl serverless deploy . --remote-build
    

二、注意:无服务器环境下SQLite3的致命局限性

就算构建成功,你依然会遇到数据丢失、无法共享的问题,因为DigitalOcean无服务器函数的运行特性:

  • 函数运行在临时无状态容器中,./data.db仅存在于当前容器,容器销毁后数据直接丢失
  • 不同函数调用可能分配到不同容器,各容器的数据库文件完全独立,无法实现数据共享
  • 无服务器环境的本地存储是临时挂载,不支持持久化数据

三、推荐的替代方案

改用DigitalOcean托管数据库(Managed Database),比如PostgreSQL或MySQL,通过网络连接实现持久化、共享数据:

示例调整后的PostgreSQL版本代码

package main

import (
    "database/sql"
    "fmt"
    "os"
    _ "github.com/lib/pq"
)

func Main(args map[string]interface{}) map[string]interface{} {
    // 从环境变量读取数据库连接串(避免硬编码)
    connStr := os.Getenv("DATABASE_URL")
    db, err := sql.Open("postgres", connStr)
    checkErr(err)
    defer db.Close()

    // 确保表存在(首次运行自动创建)
    _, err = db.Exec(`CREATE TABLE IF NOT EXISTS userinfo (
        id SERIAL PRIMARY KEY,
        username TEXT,
        departname TEXT,
        created DATE
    )`)
    checkErr(err)

    // 插入数据
    stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created) values(?,?,?)")
    checkErr(err)
    defer stmt.Close()

    res, err := stmt.Exec("rumi", "CSE", "2012-12-09")
    checkErr(err)

    id, err := res.LastInsertId()
    checkErr(err)

    fmt.Println(id)

    msg := make(map[string]interface{})
    msg["body"] = id
    return msg
}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

更新project.yml配置(添加数据库环境变量)

environment: {}
parameters: {}
packages:
  - name: blog
    environment: {}
    parameters: {}
    annotations: {}
    functions:
      - name: db
        binary: false
        main: ''
        runtime: 'go:default'
        web: true
        parameters: {}
        environment:
          DATABASE_URL: "postgres://你的数据库用户名:密码@数据库主机:端口/数据库名?sslmode=require"
        annotations: {}
        limits: {}

内容的提问来源于stack exchange,提问作者Manzurul Hoque Rumi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:05:30