乐闻世界logo
搜索文章和话题

How to store ipv4 and ipv6 addresses in postgresql using GORM

1个答案

1

When using GORM with PostgreSQL in a Go project to store IPv4 and IPv6 addresses, an effective approach is to utilize PostgreSQL's built-in inet or cidr types. Both types can efficiently store IP addresses and automatically handle compatibility between IPv4 and IPv6. Below, I will provide a detailed explanation of how to implement this in your project.

Step 1: Define the Model

First, define a Go struct to map the database table. Assume you have a table named network_devices containing device IP addresses.

go
package models import ( "gorm.io/gorm" ) type NetworkDevice struct { gorm.Model IPAddress string `gorm:"type:inet"` // Use the `inet` type to store IP addresses }

In this example, specifying gorm:"type:inet" for the IPAddress field instructs GORM to use PostgreSQL's inet type for storage. This type natively supports both IPv4 and IPv6 addresses.

Step 2: Migrate the Database

Next, migrate the database to create or update the table structure. Use GORM's migration tool for this purpose.

go
package main import ( "gorm.io/driver/postgres" "gorm.io/gorm" "log" "your_project/models" ) func main() { // Connect to the database dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf("Failed to connect to database: %v", err) } // Migrate the schema err = db.AutoMigrate(&models.NetworkDevice{}) if err != nil { log.Fatalf("Failed to migrate database: %v", err) } }

This code creates or updates the network_devices table, ensuring it includes an inet column suitable for storing IPv4 and IPv6 addresses.

Step 3: Insert and Query Data

Finally, insert and query data containing IP addresses.

go
package main import ( "fmt" "gorm.io/driver/postgres" "gorm.io/gorm" "log" "your_project/models" ) func main() { // Example: Insert data db, _ := gorm.Open(postgres.Open("your_connection_string"), &gorm.Config{}) device := models.NetworkDevice{IPAddress: "192.168.1.1"} // IPv4 result := db.Create(&device) if result.Error != nil { log.Printf("Error while inserting data: %v", result.Error) } // Example: Query data var retrievedDevice models.NetworkDevice db.First(&retrievedDevice, "ip_address = ?", "192.168.1.1") fmt.Printf("Retrieved Device: %+v\n", retrievedDevice) }

With this implementation, you can effectively store and manage IPv4 and IPv6 addresses in your Go project using GORM and PostgreSQL. Leveraging PostgreSQL's inet type ensures data integrity and optimal query performance.

2024年8月12日 18:23 回复

你的答案