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[¶m2=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))
}
注意事项
- Firebird的DDL语句(如CREATE TABLE)通常需要在事务中执行
- Firebird的标识符(表名、列名等)默认区分大小写,建议使用大写或引号包裹
- 日期时间类型需要使用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数据库的基本方法。根据实际需求,你可以进一步探索更复杂的查询和操作。