golang Firebird数据库SQL驱动插件库firebirdsql的使用

Golang Firebird数据库SQL驱动插件库firebirdsql的使用

简介

firebirdsql是Firebird RDBMS的Go语言SQL驱动。

要求

  • Firebird 2.5或更高版本
  • Golang 1.20或更高版本

基本使用示例

package main

import (
    "fmt"
    "database/sql"
    _ "github.com/nakagami/firebirdsql"
)

func main() {
    var n int
    // 连接Firebird数据库
    conn, _ := sql.Open("firebirdsql", "user:password@servername/foo/bar.fdb")
    defer conn.Close()
    
    // 执行查询
    conn.QueryRow("SELECT Count(*) FROM rdb$relations").Scan(&n)
    fmt.Println("Relations count=", n)
}

事件处理示例

package main

import (
    "fmt"
    "github.com/nakagami/firebirdsql"
)

func main() {
    dsn := "user:password@servername/foo/bar.fdb"
    events := []string{"my_event", "order_created"}
    
    // 创建Firebird事件连接
    fbEvent, _ := firebirdsql.NewFBEvent(dsn)
    defer fbEvent.Close()
    
    // 订阅事件
    sbr, _ := fbEvent.Subscribe(events, func(event firebirdsql.Event) { // 也可以使用SubscribeChan
        fmt.Printf("event: %s, count: %d, id: %d, remote id:%d \n", 
            event.Name, event.Count, event.ID, event.RemoteID)
    })
    defer sbr.Unsubscribe()
    
    // 发布事件
    go func() {
        fbEvent.PostEvent(events[0])
        fbEvent.PostEvent(events[1])
    }()
    
    <- make(chan struct{}) // 等待
}

连接字符串格式

user:password@servername[:port_number]/database_name_or_file[?params1=value1[&param2=value2]...]

通用参数

  • user: 登录用户名
  • password: 登录密码
  • servername: Firebird服务器的主机名或IP地址
  • port_number: 端口号,默认为3050
  • database_name_or_file: 数据库路径(或别名)

可选参数

名称 描述 默认值 备注
auth_plugin_name 认证插件名称 Srp256 可用值: Srp256/Srp/Legacy_Auth
column_name_to_lower 强制列名转为小写 false 用于"github.com/jmoiron/sqlx"
role 角色名称
timezone 时区名称 用于Firebird 4.0+
wire_crypt 是否启用数据加密 true 用于Firebird 3.0+
charset Firebird字符集

GORM支持

可以使用gorm-firebird库来支持GORM操作Firebird数据库。


更多关于golang Firebird数据库SQL驱动插件库firebirdsql的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang Firebird数据库SQL驱动插件库firebirdsql的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Firebird数据库SQL驱动插件库firebirdsql的使用

Firebird是一个开源的关系型数据库管理系统,在Golang中可以使用firebirdsql驱动来连接和操作Firebird数据库。下面我将详细介绍如何使用这个驱动。

安装firebirdsql驱动

首先需要安装firebirdsql驱动:

go get github.com/nakagami/firebirdsql

基本使用示例

1. 连接数据库

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/nakagami/firebirdsql"
)

func main() {
	// 连接字符串格式: username:password@hostname:port/path_to_database
	dsn := "SYSDBA:masterkey@localhost:3050/path/to/your/database.fdb"
	
	// 打开数据库连接
	db, err := sql.Open("firebirdsql", dsn)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 测试连接
	err = db.Ping()
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Println("成功连接到Firebird数据库")
}

2. 执行查询

// 查询示例
func queryExample(db *sql.DB) {
	rows, err := db.Query("SELECT id, name, age FROM users WHERE age > ?", 18)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var id int
		var name string
		var age int
		err = rows.Scan(&id, &name, &age)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age)
	}

	if err = rows.Err(); err != nil {
		log.Fatal(err)
	}
}

3. 执行插入、更新、删除操作

// 插入数据
func insertExample(db *sql.DB) {
	result, err := db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", "张三", 25)
	if err != nil {
		log.Fatal(err)
	}

	lastInsertID, err := result.LastInsertId()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("插入成功,ID: %d\n", lastInsertID)

	rowsAffected, err := result.RowsAffected()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("影响行数: %d\n", rowsAffected)
}

// 更新数据
func updateExample(db *sql.DB) {
	result, err := db.Exec("UPDATE users SET age = ? WHERE name = ?", 30, "张三")
	if err != nil {
		log.Fatal(err)
	}

	rowsAffected, err := result.RowsAffected()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("更新了 %d 行\n", rowsAffected)
}

// 删除数据
func deleteExample(db *sql.DB) {
	result, err := db.Exec("DELETE FROM users WHERE age < ?", 18)
	if err != nil {
		log.Fatal(err)
	}

	rowsAffected, err := result.RowsAffected()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("删除了 %d 行\n", rowsAffected)
}

4. 事务处理

func transactionExample(db *sql.DB) {
	// 开始事务
	tx, err := db.Begin()
	if err != nil {
		log.Fatal(err)
	}

	// 执行事务中的SQL
	_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", 100, 1)
	if err != nil {
		// 出错则回滚
		tx.Rollback()
		log.Fatal(err)
	}

	_, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", 100, 2)
	if err != nil {
		// 出错则回滚
		tx.Rollback()
		log.Fatal(err)
	}

	// 提交事务
	err = tx.Commit()
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Println("事务执行成功")
}

高级特性

1. 连接池配置

func main() {
	dsn := "SYSDBA:masterkey@localhost:3050/path/to/your/database.fdb"
	db, err := sql.Open("firebirdsql", dsn)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 配置连接池
	db.SetMaxOpenConns(25)     // 最大打开连接数
	db.SetMaxIdleConns(5)      // 最大空闲连接数
	db.SetConnMaxLifetime(5 * time.Minute) // 连接最大存活时间

	// 使用数据库...
}

2. 处理BLOB类型

Firebird中的BLOB类型可以这样处理:

func blobExample(db *sql.DB) {
	// 插入BLOB数据
	data := []byte{0x01, 0x02, 0x03, 0x04}
	_, err := db.Exec("INSERT INTO documents(name, content) VALUES(?, ?)", "test.doc", data)
	if err != nil {
		log.Fatal(err)
	}

	// 读取BLOB数据
	var content []byte
	err = db.QueryRow("SELECT content FROM documents WHERE name = ?", "test.doc").Scan(&content)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("BLOB数据长度: %d\n", len(content))
}

注意事项

  1. Firebird的DDL语句(如CREATE TABLE)通常需要在事务中执行
  2. Firebird的标识符(表名、列名等)默认区分大小写,建议使用大写或引号包裹
  3. 日期时间类型需要使用Firebird特定的格式

完整示例

package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "github.com/nakagami/firebirdsql"
)

func main() {
	// 连接数据库
	dsn := "SYSDBA:masterkey@localhost:3050/C:/data/test.fdb"
	db, err := sql.Open("firebirdsql", dsn)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 配置连接池
	db.SetMaxOpenConns(10)
	db.SetMaxIdleConns(2)
	db.SetConnMaxLifetime(30 * time.Minute)

	// 测试连接
	err = db.Ping()
	if err != nil {
		log.Fatal(err)
	}

	// 创建表(需要在事务中执行)
	tx, err := db.Begin()
	if err != nil {
		log.Fatal(err)
	}

	_, err = tx.Exec(`
		CREATE TABLE users (
			id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
			name VARCHAR(50) NOT NULL,
			age INTEGER,
			created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
		)
	`)
	if err != nil {
		tx.Rollback()
		log.Fatal(err)
	}
	tx.Commit()

	// 插入数据
	insertExample(db)

	// 查询数据
	queryExample(db)

	// 事务示例
	transactionExample(db)
}

func insertExample(db *sql.DB) {
	_, err := db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", "李四", 28)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("插入数据成功")
}

func queryExample(db *sql.DB) {
	rows, err := db.Query("SELECT id, name, age, created_at FROM users")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	fmt.Println("\n用户列表:")
	for rows.Next() {
		var id int
		var name string
		var age sql.NullInt64
		var createdAt time.Time

		err = rows.Scan(&id, &name, &age, &createdAt)
		if err != nil {
			log.Fatal(err)
		}

		ageStr := "NULL"
		if age.Valid {
			ageStr = fmt.Sprintf("%d", age.Int64)
		}

		fmt.Printf("ID: %d, 姓名: %s, 年龄: %s, 创建时间: %s\n", 
			id, name, ageStr, createdAt.Format("2006-01-02 15:04:05"))
	}
}

func transactionExample(db *sql.DB) {
	tx, err := db.Begin()
	if err != nil {
		log.Fatal(err)
	}

	// 执行事务操作
	_, err = tx.Exec("UPDATE users SET age = age + 1 WHERE name = ?", "李四")
	if err != nil {
		tx.Rollback()
		log.Fatal(err)
	}

	_, err = tx.Exec("INSERT INTO users(name, age) VALUES(?, ?)", "王五", 35)
	if err != nil {
		tx.Rollback()
		log.Fatal(err)
	}

	err = tx.Commit()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("事务执行成功")
}

以上就是使用Golang操作Firebird数据库的基本方法。根据实际需求,你可以进一步探索更复杂的查询和操作。

回到顶部