如何使用Golang SDK查询任意table个RDS
How to query any table of RDS using Golang SDK
我正在编写一个 AWS lambda 以使用 Golang SDK 从 RDS(SQL 服务器)查询 10 个不同的 tables。到目前为止我学到的是我们必须为 table 创建一个类似的结构来查询它。但是因为我想查询 10 tables,所以我不想为每个 table 创建结构,甚至 table 架构可能有一天会改变。
最近,我想为每个 table 创建一个 CSV 文件作为查询数据的备份,并将其上传到 S3。那么是否可以直接将 CSV 文件导入到 lambda 中,以便我可以直接将其上传到 S3?
你可以在下面看到我当前的代码
func executeQuery(dbconnection *sql.DB) {
println("\n\n----------Executing Query ----------")
query := "select TOP 5 City,State,Country from IMBookingApp.dbo.Address"
rows, err := dbconnection.Query(query)
if err != nil {
fmt.Println("Error:")
log.Fatal(err)
}
println("rows", rows)
defer rows.Close()
count := 0
for rows.Next() {
var City, State, Country string
rows.Columns
err := rows.Scan(&City, &State, &Country)
if err != nil {
fmt.Println("Error reading rows: " + err.Error())
}
fmt.Printf("City: %s, State: %s, Country: %s\n", City, State, Country)
count++
}
}
此代码仅适用于 Address
table,不适用于其他 table
我也用 GORM 试过了
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mssql"
)
type Currency struct {
CurrencyId int `gorm:"column:CurrencyId;"`
Code string `gorm:"column:Code;"`
Description string `gorm:"column:Description;"`
}
func main() {
db, err := gorm.Open("mssql", "sqlserver://***")
db.SingularTable(true)
gorm.DefaultTableNameHandler = func(dbVeiculosGorm *gorm.DB, defaultTableName string) string {
return "IMBookingApp.dbo.Currency"
}
fmt.Println("HasTable-Currency:", db.HasTable("ClientUser"))
var currency Currency
db.Debug().Find(¤cy)
fmt.Println("Currency:", currency)
fmt.Println("Error", err)
defer db.Close()
}
对于这两种方法,我都找不到任何方法来使代码对多个 table 通用。如果有人能给我一些建议或者你能指出一些资源,我将不胜感激。
我没有测试这段代码,但应该可以让您了解如何将行提取到字符串数组中。
defer rows.Close()
columns, err := rows.Columns()
if err != nil {
panic(err)
}
for rows.Next() {
receiver := make([]*string, len(columns))
err := rows.Scan(receiver)
if err != nil {
fmt.Println("Error reading rows: " + err.Error())
}
}
GO 在内部将许多类型转换为字符串 - https://github.com/golang/go/blob/master/src/database/sql/convert.go#L219
如果无法转换数据,您有 2 个选择:
- 简单 - 将您的 SQL 查询更新为 return 字符串或字符串兼容数据
- 复杂。使用 slice of
interface{}
而不是 slice of *string 并使用基于 rows.ColumnTypes()
的正确类型的默认值填充它。稍后您必须将实际值转换为字符串以保存到 csv 中。
下面的代码对我有用 -
conn, _ := getConnection() // Get database connection
rows, err := conn.Query(query)
if err != nil {
fmt.Println("Error:")
log.Fatal(err)
}
defer rows.Close()
columns, err := rows.Columns()
if err != nil {
panic(err)
}
for rows.Next() {
receiver := make([]string, len(columns))
is := make([]interface{}, len(receiver))
for i := range is {
is[i] = &receiver[i]
// each is[i] will be of type interface{} - compatible with Scan()
// using the underlying concrete `*string` values from `receiver`
}
err := rows.Scan(is...)
if err != nil {
fmt.Println("Error reading rows: " + err.Error())
}
fmt.Println("receiver", receiver)
参考:-
我正在编写一个 AWS lambda 以使用 Golang SDK 从 RDS(SQL 服务器)查询 10 个不同的 tables。到目前为止我学到的是我们必须为 table 创建一个类似的结构来查询它。但是因为我想查询 10 tables,所以我不想为每个 table 创建结构,甚至 table 架构可能有一天会改变。
最近,我想为每个 table 创建一个 CSV 文件作为查询数据的备份,并将其上传到 S3。那么是否可以直接将 CSV 文件导入到 lambda 中,以便我可以直接将其上传到 S3? 你可以在下面看到我当前的代码
func executeQuery(dbconnection *sql.DB) {
println("\n\n----------Executing Query ----------")
query := "select TOP 5 City,State,Country from IMBookingApp.dbo.Address"
rows, err := dbconnection.Query(query)
if err != nil {
fmt.Println("Error:")
log.Fatal(err)
}
println("rows", rows)
defer rows.Close()
count := 0
for rows.Next() {
var City, State, Country string
rows.Columns
err := rows.Scan(&City, &State, &Country)
if err != nil {
fmt.Println("Error reading rows: " + err.Error())
}
fmt.Printf("City: %s, State: %s, Country: %s\n", City, State, Country)
count++
}
}
此代码仅适用于 Address
table,不适用于其他 table
我也用 GORM 试过了
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mssql"
)
type Currency struct {
CurrencyId int `gorm:"column:CurrencyId;"`
Code string `gorm:"column:Code;"`
Description string `gorm:"column:Description;"`
}
func main() {
db, err := gorm.Open("mssql", "sqlserver://***")
db.SingularTable(true)
gorm.DefaultTableNameHandler = func(dbVeiculosGorm *gorm.DB, defaultTableName string) string {
return "IMBookingApp.dbo.Currency"
}
fmt.Println("HasTable-Currency:", db.HasTable("ClientUser"))
var currency Currency
db.Debug().Find(¤cy)
fmt.Println("Currency:", currency)
fmt.Println("Error", err)
defer db.Close()
}
对于这两种方法,我都找不到任何方法来使代码对多个 table 通用。如果有人能给我一些建议或者你能指出一些资源,我将不胜感激。
我没有测试这段代码,但应该可以让您了解如何将行提取到字符串数组中。
defer rows.Close()
columns, err := rows.Columns()
if err != nil {
panic(err)
}
for rows.Next() {
receiver := make([]*string, len(columns))
err := rows.Scan(receiver)
if err != nil {
fmt.Println("Error reading rows: " + err.Error())
}
}
GO 在内部将许多类型转换为字符串 - https://github.com/golang/go/blob/master/src/database/sql/convert.go#L219
如果无法转换数据,您有 2 个选择:
- 简单 - 将您的 SQL 查询更新为 return 字符串或字符串兼容数据
- 复杂。使用 slice of
interface{}
而不是 slice of *string 并使用基于rows.ColumnTypes()
的正确类型的默认值填充它。稍后您必须将实际值转换为字符串以保存到 csv 中。
下面的代码对我有用 -
conn, _ := getConnection() // Get database connection
rows, err := conn.Query(query)
if err != nil {
fmt.Println("Error:")
log.Fatal(err)
}
defer rows.Close()
columns, err := rows.Columns()
if err != nil {
panic(err)
}
for rows.Next() {
receiver := make([]string, len(columns))
is := make([]interface{}, len(receiver))
for i := range is {
is[i] = &receiver[i]
// each is[i] will be of type interface{} - compatible with Scan()
// using the underlying concrete `*string` values from `receiver`
}
err := rows.Scan(is...)
if err != nil {
fmt.Println("Error reading rows: " + err.Error())
}
fmt.Println("receiver", receiver)
参考:-