我已经写了一个玩具应用程序来尝试通过sqlx使用Postgresql。我有一个大容量插入器
pq.CopyIn
作为准备好的陈述的内容
stmt, _ := tx.Preparex(pq.CopyIn(tablename, column, column, ...)
然后,我将继续向正在创建的体量插入添加行。
tx.Exec(..., ..., ...)
然后最后执行准备好的语句
stmt.Exec()
这以前工作得很好,但是现在我又回到了它,试着执行这个代码,它挂在
stmt.Exec
我是否在代码中遗漏了什么,或者这一切都与数据库引擎有关,没有响应。
这是我的完整代码。
package main
import (
_ "database/sql"
"fmt"
"log"
"encoding/json"
"io/ioutil"
"os"
"github.com/jmoiron/sqlx"
"github.com/lib/pq"
)
var schema = `
CREATE TABLE IF NOT EXISTS contact (
id Serial,
first_name text,
last_name text,
email text
);`
type Contact struct {
Id int `json:"-"`
First_name string `json:"first_name"`
Last_name string `json:"last_name"`
Email string `json:"email"`
}
type Contacts struct {
Contacts []Contact `json:"contacts"`
}
func (c *Contacts) createFromJSON(json_str []byte) error {
b := []byte(json_str)
err := json.Unmarshal(b, &c)
if err != nil {
log.Fatal(err)
}
return err
}
func (c *Contacts) save(db *sqlx.DB) error {
tx := db.MustBegin()
stmt, _ := tx.Preparex(pq.CopyIn("contact", "first_name", "last_name", "email"))
for _, contact := range c.Contacts {
tx.Exec(contact.First_name, contact.Last_name, contact.Email)
}
_, err := stmt.Exec()
if err != nil {
log.Fatal(err)
return err
}
err = stmt.Close()
if err != nil {
log.Fatal(err)
return err
}
tx.Commit()
return nil
}
func connect() (*sqlx.DB, error) {
db, err := sqlx.Connect("postgres", "user=pqgotest dbname=pqgotest sslmode=disable")
if err != nil {
log.Fatal(err)
}
return db, err
}
func createTables(db *sqlx.DB) {
db.MustExec(schema)
}
func main() {
db, err := connect()
if err != nil {
os.Exit(1)
}
createTables(db)
contactsJson, e := ioutil.ReadFile("./contacts.json")
if e != nil {
fmt.Printf("File error: %v\n", e)
os.Exit(1)
}
tx := db.MustBegin()
tx.MustExec("DELETE FROM contact")
tx.Commit()
contacts := new(Contacts)
contacts.createFromJSON(contactsJson)
contacts.save(db)
people := new(Contacts)
db.Select(people.Contacts, "SELECT * FROM contact ORDER BY email,id ASC")
for _, contact := range people.Contacts {
contact_json, err := json.Marshal(contact)
if err != nil {
log.Fatal(err)
os.Exit(1)
}
fmt.Printf("%s\n", contact_json)
}
}
如果有帮助的话,我也可以包括contacts.json文件的内容。
使现代化
是的,最后很明显。我在从tx创建一个声明,
stmt, _ := tx.Preparex(pq.CopyIn(tablename, column, column, ...)
进一步的补充应该是stmt
stmt.Exec(..., ..., ...)
另一个与这个问题不直接相关的错误是,我在结构联系人的联系人字段中插入了一个联系人数组
people := new(Contacts)
db.Select(people.Contacts, "SELECT * FROM contact ORDER BY email,id ASC")
应该传递一个指针,指向Contacts数组字段中Contacts的Select方法db,如下所示
db.Select(&people.Contacts, "SELECT * FROM contact ORDER BY email,id ASC")
以防人们稍后尝试运行此代码,并想知道为什么它没有将结果打印到控制台。
从大宗进口部分https://godoc.org/github.com/lib/pq,应该是
stmt.Exec(contact.First_name, contact.Last_name, contact.Email)
问题内容: 在Java中,我注意到有时在我的代码中,语句先显示在语句之前,尽管后者先出现在语句之前。为什么?我很好奇。 问题答案: 通常,它是缓冲的输出流,因此在将文本刷新到目标位置之前会对其进行累积。由于可以最大程度地减少必须进行的昂贵系统调用的次数,因此可以大大提高打印大量文本的应用程序的性能。但是,这意味着文本并不总是立即显示,并且可能比书写的要晚得多。 另一方面,通常不缓冲,因为需要立即打
问题内容: 我惊讶地发现Go带有“ goto”语句。我一直被教导说,“ goto”语句已经成为过去,并且因为它阻塞了程序的实际流程,所以它变得邪恶,而函数或方法始终是控制流程的更好方法。 我肯定错过了什么。Google为什么要包含它? 问题答案: 当我们实际检查Go标准库的源代码时,我们可以看到s在哪些地方得到了很好的应用。 例如,在文件中,使用以下语句: 在从导入只是控制流使用的另一(布尔值)的
问题内容: 我正在尝试使用Golang sqlx库创建准备好的语句。我想让表名成为bindVar 但是,这给了我一个语法错误。我可以不使用绑定变量作为表名吗? 问题答案: 我可以不使用绑定变量作为表名吗? 不,报价来源。 参数只能用作数据值,不能用作标识符。因此,例如,这是合理的: 但这不起作用: 但是,如果需要,可以使用表名,而将$ 1,$ 2,…保留为数据值。
我已经写了一个准备好的语句,但它给出了一个语法错误?。我不明白出了什么问题。它应该传递一个电影名称,并作为该电影的导演获得结果
问题内容: 我正在尝试与大学的MySQL数据库建立连接,但该连接已挂起。 此调用:打印(在我最终杀死它之后): 我刚刚从下载的MySQL连接器/ J 这里。我不确定这是否是问题的一部分。我非常准确地遵循了指示。 我也可以像这样在命令行上连接到mysql: 可能的问题: 我写的Java代码 我如何安装MySQL Connector / J 某种网络问题阻止了连接 问题: 我应该怎么解决这个问题?为什
问题内容: 我有一个问题,我需要查找具有与值匹配的度量 或 根本没有该度量的记录。我使用s,using和using三种或四种不同的方法解决了该问题。但是,每次查询最终都变得非常慢。然后,我尝试将查询一分为二,它们都非常快地运行(三秒钟)。但是使用组合查询需要花费超过五分钟的时间。 在SO上阅读,我尝试了,速度非常快,但是对于我正在使用的脚本非常不便。 有两个问题: 为什么这么快?(或者为什么这么慢