在Python中,我有以下将不使用文件将行批量加载到Postgresql的方法:
import csv
import subprocess
mylist, keys = [{'name': 'fred'}, {'name': 'mary'}], ['name']
p = subprocess.Popen(['psql', 'mydb', '-U', 'openupitsme', '-h', 'my.ip.address', '--no-password', '-c',
'\COPY tester(%s) FROM STDIN (FORMAT CSV)' % ', '.join(keys),
'--set=ON_ERROR_STOP=false'
], stdin=subprocess.PIPE
)
for d in mylist:
dict_writer = csv.DictWriter(p.stdin, keys, quoting=csv.QUOTE_MINIMAL)
dict_writer.writerow(d)
p.stdin.close()
我正在尝试在Go中完成相同的任务。我目前正在将行写入文件,然后将其导入,然后删除该文件。我想像在Python中一样从STDIN导入行。我有:
package main
import (
"database/sql"
"log"
"os"
"os/exec"
_ "github.com/lib/pq"
)
var (
err error
db *sql.DB
)
func main() {
var err error
fh := "/path/to/my/file.txt"
f, err := os.Create(fh)
if err != nil {
panic(err)
}
defer f.Close()
defer os.Remove(fh)
rows := []string{"fred", "mary"}
for _, n := range rows {
_, err = f.WriteString(n + "\n")
if err != nil {
panic(err)
}
}
// dump to postgresql
c := exec.Command("psql", "mydb", "-U", "openupitsme", "-h", "my.ip.address", "--no-password",
"-c", `\COPY tester(customer) FROM `+fh)
if out, err := c.CombinedOutput(); err != nil {
log.Println(string(out), err)
}
}
编辑:进一步,但这不是插入记录:
keys := []string{"link", "domain"}
records := [][]string{
{"first_name", "last_name"},
{"Rob", "Pike"},
{"Ken", "Thompson"},
{"Robert", "Griesemer"},
}
cmd := exec.Command("psql")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Println(err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Println(err)
}
if err := cmd.Start(); err != nil {
log.Println(err)
}
go func() {
_, err = io.WriteString(stdin, "search -U meyo -h 1.2.3.4 -p 1111 --no-password -c ")
if err != nil {
log.Println(err)
}
_, err := io.WriteString(stdin, fmt.Sprintf("COPY links(%s) FROM STDIN (FORMAT CSV)", strings.Join(keys, ",")))
if err != nil {
log.Println(err)
}
w := csv.NewWriter(stdin)
if err := w.WriteAll(records); err != nil {
log.Fatalln("error writing record to csv:", err)
}
w.Flush()
if err := w.Error(); err != nil {
log.Fatal(err)
}
if err != nil {
log.Println(err)
}
stdin.Close()
}()
done := make(chan bool)
go func() {
_, err := io.Copy(os.Stdout, stdout)
if err != nil {
log.Fatal(err)
}
stdout.Close()
done <- true
}()
<-done
if err := cmd.Wait(); err != nil {
log.Println(err, cmd.Args, stdout)
}
没有插入任何记录,并且出现无用的错误:
exit status 2
下面的代码应指导您要走的方向:
package main
import (
"fmt"
"log"
"os"
"os/exec"
"strings"
)
func main() {
keys := []string{"customer"}
sqlCmd := fmt.Sprintf("COPY tester(%s) FROM STDIN (FORMAT CSV)", strings.Join(keys, ","))
cmd := exec.Command("psql", "<dbname>", "-U", "<username>", "-h", "<host_ip>", "--no-password", "-c", sqlCmd)
cmd.Stdin = os.Stdin
output, _ := cmd.CombinedOutput()
log.Println(string(output))
}
如果密钥需要动态,则可以从中获取密钥os.Args
。
请注意,如果您打算使用psql命令,则不需要导入数据库/ sql或lib / pq。如果您对使用lib / pq感兴趣,请参阅lib /
pq文档中的Bulk Imports。
我想从STDIN读取输入。我在C中使用fork()方法。我有子进程和父进程。我的输入是多行的。父进程只等待子进程终止,子进程只读取第一行,子进程终止后,父进程继续读取。我想要打印行。例如;输入-> null 子进程打印“星期一”,父进程打印“星期二”和“星期三”。一旦到达文件结尾,程序就会终止。 ./program
问题内容: 我需要分析mongodb中的集合中有大量数据。如何将这些数据导入熊猫? 我是pandas和numpy的新手。 编辑:mongodb集合包含带有日期和时间标记的传感器值。传感器值是float数据类型。 样本数据: 问题答案: 可能会帮助您,以下是我正在使用的一些代码:
问题内容: 我正在尝试编写一个使用pdftk应用程序的PHP脚本,以将XFDF与PDF表单合并,然后将合并的PDF输出给用户。根据pdftk文档,我可以通过传递表单数据,并将PDF输出到流中。从命令行使用pdftk的通常的,非文件非流方式是: 要在命令行上使用流,请输入: 我有几个问题: 1)我已经得到pdftk,通过使用xfdf文件(而不是)返回输出,如下所示: 但是,根据Adobe Reade
问题内容: 我正在使用以下命令行调用来处理带有node的文本文件: 文件的每一行都需要单独处理,但是一旦处理完,输入行可能会被忘记。 使用标准输入的数据侦听器,我得到了按字节大小分块的输入流,因此进行了设置。 但这似乎草率。必须在行数组的第一项和最后一项周围进行按摩。有没有更优雅的方式做到这一点? 问题答案: 您可以使用readline模块逐行从stdin进行读取:
问题内容: 代码很简单: 有没有办法编译来自标准输出的代码? 我已经试过了: 和一些变体,但没有一个产生可执行文件。 只是一些澄清。我有一个预处理文件的程序,并生成另一个要编译的文件。我考虑过不创建此中间文件,而是直接生成目标文件。 问题答案: 编译器可能会告诉您: 尝试
我需要帮助了解如何从函数运行导入代码! 正如你所看到的,我是新来的python. time语音是另一个. py文件,当我做运行。我试图通过一个函数来运行它,如果在列表中回答:timespeech.say时间(),我相信你应该把它作为,但我不确定之后会发生什么。请帮助!