实现思路

  • 使用 GORM 连接数据库时,检查数据库是否存在。
  • 如果数据库不存在,执行 SQL 语句创建数据库。
  • 然后重新连接到新创建的数据库,并进行后续操作(如自动迁移表结构)。
package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
)

// 定义模型(示例)
type User struct {
	gorm.Model
	Name string
}

func main() {
	// 数据库连接配置
	username := "your_username"
	password := "your_password"
	host := "localhost"
	port := "3306"
	database := "your_database"

	// 初始 DSN(不指定数据库,用于检查和创建数据库)
	rootDSN := fmt.Sprintf("%s:%s@tcp(%s:%s)/?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port)

	// 连接 MySQL(不指定数据库)
	db, err := gorm.Open(mysql.Open(rootDSN), &gorm.Config{})
	if err != nil {
		log.Fatalf("无法连接到 MySQL: %v", err)
	}

	// 检查数据库是否存在
	var count int64
	db.Raw("SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name = ?", database).Scan(&count)

	if count == 0 {
		// 数据库不存在,创建数据库
		err = db.Exec(fmt.Sprintf("CREATE DATABASE `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci", database)).Error
		if err != nil {
			log.Fatalf("创建数据库失败: %v", err)
		}
		fmt.Printf("数据库 %s 创建成功\n", database)
	}

	// 关闭初始连接
	sqlDB, _ := db.DB()
	sqlDB.Close()

	// 连接到新创建的数据库
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, database)
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("无法连接到数据库 %s: %v", database, err)
	}

	// 自动迁移表结构
	err = db.AutoMigrate(&User{})
	if err != nil {
		log.Fatalf("自动迁移失败: %v", err)
	}

	fmt.Println("数据库初始化完成!")
}

代码说明

  • 连接 MySQL:通过不指定数据库的 DSN 连接到 MySQL 服务器(rootDSN)。
  • 检查数据库:使用 information_schema.schemata 查询数据库是否已存在。
  • 创建数据库:如果数据库不存在,执行 CREATE DATABASE 语句。
  • 重新连接:关闭初始连接,使用包含数据库名称的 DSN 重新连接到新创建的数据库。
  • 自动迁移:使用 AutoMigrate 创建或更新表结构。

针对其他数据库的适配

PostgreSQL:

  • 检查数据库:SELECT 1 FROM pg_database WHERE datname = ?
  • 创建数据库:CREATE DATABASE your_database
  • DSN 格式:host=localhost user=your_username password=your_password dbname=your_database port=5432 sslmode=disable

SQLite:

  • SQLite 不需要手动创建数据库,GORM 会在连接时自动创建数据库文件。
  • 示例:db, err := gorm.Open(sqlite.Open("your_database.db"), &gorm.Config{})
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐