当前位置: 首页 > 知识库问答 >
问题:

为什么sqlx的copyin语句会挂起?

盖昀
2023-03-14

我已经写了一个玩具应用程序来尝试通过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")

以防人们稍后尝试运行此代码,并想知道为什么它没有将结果打印到控制台。

共有1个答案

赵刚豪
2023-03-14

从大宗进口部分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上阅读,我尝试了,速度非常快,但是对于我正在使用的脚本非常不便。 有两个问题: 为什么这么快?(或者为什么这么慢