查询用户时遇到困难,定义如下:
type User struct {
ID int `db:"id" json:"id"`
UserName string `db:"username" json:"username"`
Email string `db:"email" json:"email"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
StatusID uint8 `db:"status_id" json:"status_id"`
Deleted uint8 `db:"deleted" json:"deleted"`
...
}
Run Code Online (Sandbox Code Playgroud)
MariaDB中的表定义为:
+--------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+-------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | | NA | |
| email | varchar(255) | NO | | …Run Code Online (Sandbox Code Playgroud) 我使用jmoiron/sqlx库与我的Go应用程序中的PostgreSql服务器进行通信.在我的应用程序的某个地方,我有以下代码:
sqlQuery := `
INSERT INTO table_to_insert (
code,
status,
create_time,
create_by
) VALUES (
'',
0,
CURRENT_TIMESTAMP,
0
) RETURNING id
`
datas, err := tx.NamedExec(sqlQuery, structToInsert)
Run Code Online (Sandbox Code Playgroud)
问题:如何使用返回来获取最后一个插入ID tx.NamedExec()?我已经尝试datas.LastInsertId()但它总是返回0.
注意:我确定插入postgres是成功的.
我搜索了错误,我发现了两个问题:
这是我的代码:
package main
import (
"log"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
)
var schema = `
CREATE TABLE films (
code int,
name VARCHAR(10)
)`
type Film struct {
code int
name string
}
func main() {
db, err := sqlx.Open("postgres", "user=demas password=root host=192.168.99.100 port=32768 dbname=mydb sslmode=disable")
if err != nil {
log.Fatal(err)
}
db.MustExec(schema)
tx := db.MustBegin()
tx.MustExec("INSERT INTO films(code, name) VALUES($1, $2)", 10, "one")
tx.MustExec("INSERT INTO films(code, name) VALUES($1, $2)", 20, "two")
tx.Commit()
films := …Run Code Online (Sandbox Code Playgroud) 在Golang中处理一对多或多对多SQL关系时,将行映射到结构的最佳(高效,推荐,"Go-like")方式是什么?
以下面的示例设置,我试图详细介绍一些方法的优点和缺点,但是想知道社区推荐什么.
database/sql和jmoiron/sqlx为清楚起见,我删除了错误处理
楷模
type Tag struct {
ID int
Name string
}
type Item struct {
ID int
Tags []Tag
}
Run Code Online (Sandbox Code Playgroud)
数据库
CREATE TABLE item (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
);
CREATE TABLE tag (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR(160),
item_id INT REFERENCES item(id)
);
Run Code Online (Sandbox Code Playgroud)
方法1 - 选择所有项目,然后为每个项目选择标签
var items []Item
sqlxdb.Select(&items, "SELECT * FROM …Run Code Online (Sandbox Code Playgroud) 将 sqlx 与 postgresql 一起使用时出现错误:“缺少目标名称 rec_created_by”
type Client struct {
ClientID string `json:"client_id" db:"id"`
Name string `json:"name" db:"name"`
Version int16 `json:"version" db:"version"`
IsActivated bool `json:"is_activated" db:"is_activated"`
RecCreatedBy string `json:"rec_created_by" db:"rec_created_by"`
RecCreatedByUser *User `json:"rec_created_by_user" db:"-"`
RecCreated *time.Time `json:"rec_created" db:"rec_created"`
RecModifiedBy string `json:"rec_modified_by" db:"rec_modified_by"`
RecModifiedByUser *User `json:"rec_modified_by_user" db:"-"`
RecModified *time.Time `json:"rec_modified" db:"rec_modified"`
CultureID string `json:"culture_id" db:"culture_id"`
...
}
func (c *Client) Get(id string) error {
db, err := sqlx.Connect(settings.Settings.Database.DriverName, settings.Settings.GetDbConn())
if err != nil {
log.Fatal(err)
}
defer db.Close()
_client := Client{} …Run Code Online (Sandbox Code Playgroud) 我正在使用带有sqlx的非框架Go堆栈,以及用于Web项目的MySQL.
我想记录所有传出的SQL语句以进行调试.是否有可能做到这一点?希望得到这样的输出(从Rails项目复制):
User Load (94.4ms) SELECT `users`.* FROM `users` WHERE `users`.`login` = 'bondnewyork' LIMIT 1
User Load (16.3ms) SELECT `users`.* FROM `users` WHERE `users`.`login` = 'mkovarik' LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`login` = 'mkovarik' LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
User Load (0.4ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud) 我想在 BYTEA 列中插入一些二进制数据
我将如何将 somefile.tar.gz 的内容插入带有 BYTEA 列的表中?
我使用https://github.com/jmoiron/sqlx对 Postgres 进行查询。
插入新行时是否可以取回整行数据?
这是我运行的查询:
result, err := Db.Exec("INSERT INTO users (name) VALUES ($1)", user.Name)
Run Code Online (Sandbox Code Playgroud)
或者我应该只使用我现有的user结构作为数据库中新条目的真实来源?
我有一个这样的模型:
type Course struct {
Name string `db:"course_name"`
}
type Group struct {
Course *Course
}
type Groups []Group
Run Code Online (Sandbox Code Playgroud)
当我尝试使用如下查询执行 sqlx.Select for Groups 时:
SELECT c.name as course_name FROM courses as c;
Run Code Online (Sandbox Code Playgroud)
我明白了
*main.Groups 中缺少目标名称 course_name
错误。
这段代码有什么问题?
假设我有两个模型,
type Customer struct {
Id int `json:"id" db:"id"`
Name string `json:"name" db:"name"`
Address Address `json:"adress"`
}
type Address struct {
Street string `json:"street" db:"street"`
City string `json:"city" db:"city"`
}
// ...
customer := models.Customer{}
err := db.Get(&customer , `select * from users where id=$1 and name=$2`, id, name)
Run Code Online (Sandbox Code Playgroud)
但此扫描会引发错误:missing destination name street in *models.Customer
难道我做错了什么?正如你所看到的,我已经更新了该值对应的数据库。我仔细检查了一下,所以区分大小写应该不是问题。或者使用https://github.com/jmoiron/sqlx是不可能的吗?
我可以在文档中看到它,但仍然不知道如何解决它。 http://jmoiron.github.io/sqlx/#advancedScanning
该users表声明为:
CREATE TABLE `users` (
`id` varchar(256) NOT NULL,
`name` varchar(150) NOT NULL,
`street` varchar(150) NOT NULL, …Run Code Online (Sandbox Code Playgroud)