使用Go实例化一个SQLite数据库的方法是什么?

huangapple go评论102阅读模式
英文:

Instantiating an sqlite database with go?

问题

我从我的应用程序中提取了下面的代码。我试图创建一个新的目录,在其中放置一个sqlite数据库,然后在数据库中创建一个表。

目前它创建了目录,一个用于存在数据库的文件,并且运行时没有任何错误。然而,数据库文件是空的。我无法弄清楚为什么它是空的。

有人知道如何修改这段代码,使内容保留在数据库中吗?

package main

import (
	"os"
	"database/sql"
	"fmt"
	_ "github.com/mattn/go-sqlite3"
)

func main() {
	os.MkdirAll("./data/1234", 0755)
	os.Create("./data/1234/data.db")

	db, err := sql.Open("sqlite3", "./data/1234/data.db")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	_, err = db.Query("CREATE TABLE `customers` (`till_id` INTEGER PRIMARY KEY AUTOINCREMENT, `client_id` VARCHAR(64) NULL, `first_name` VARCHAR(255) NOT NULL, `last_name` VARCHAR(255) NOT NULL, `guid` VARCHAR(255) NULL, `dob` DATETIME NULL, `type` VARCHAR(1))")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	db.Close()
}
英文:

I have extracted the code below from my application. I am trying to create a new directory, put an sqlite database in it, then create a table in the database.

Currently it creates the directory, a file for the db to exist in and it runs without any errors. However, the db file is empty. I cannot figure out why it is empty.

Does anyone know how to modify this code so the content remains in the database?

package main

import (
	"os"
	"database/sql"
	"fmt"
	_ "github.com/mattn/go-sqlite3"
)

func main() {
	os.MkdirAll("./data/1234", 0755)
	os.Create("./data/1234/data.db")

	db, err := sql.Open("sqlite3", "./data/1234/data.db")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	_, err = db.Query("CREATE TABLE `customers` (`till_id` INTEGER PRIMARY KEY AUTOINCREMENT, `client_id` VARCHAR(64) NULL, `first_name` VARCHAR(255) NOT NULL, `last_name` VARCHAR(255) NOT NULL, `guid` VARCHAR(255) NULL, `dob` DATETIME NULL, `type` VARCHAR(1))")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

    db.Close()
}

答案1

得分: 12

你没有关闭数据库,所以更改没有被写入数据库文件。

确保执行 db.Close()

然后你需要使用 Exec 方法,而不是 Query 来修改数据库。

_, err = db.Exec("CREATE TABLE `customers` (`till_id` INTEGER PRIMARY KEY AUTOINCREMENT, `client_id` VARCHAR(64) NULL, `first_name` VARCHAR(255) NOT NULL, `last_name` VARCHAR(255) NOT NULL, `guid` VARCHAR(255) NULL, `dob` DATETIME NULL, `type` VARCHAR(1))")
if err != nil {
    log.Fatal(err)
}
英文:

You're not closing the database, so the changes aren't flushed to the database file.

Make sure you execute db.Close().

You then need to use the Exec method, not Query to modify the database.

_, err = db.Exec("CREATE TABLE `customers` (`till_id` INTEGER PRIMARY KEY AUTOINCREMENT, `client_id` VARCHAR(64) NULL, `first_name` VARCHAR(255) NOT NULL, `last_name` VARCHAR(255) NOT NULL, `guid` VARCHAR(255) NULL, `dob` DATETIME NULL, `type` VARCHAR(1))")
if err != nil {
    log.Fatal(err)
}

答案2

得分: 2

你需要使用函数Exec而不是Query来创建一个表。请查看这些函数的文档:

func (*DB) Query

Query函数执行返回行的查询,通常是SELECT语句。args参数用于查询中的任何占位符参数。

func (*DB) Exec

Exec函数执行一个查询,不返回任何行。args参数用于查询中的任何占位符参数。
英文:

You need to use the function Exec instead of Query to create a table. Take a look at the documentation for those functions:

func (*DB) Query

Query executes a query that returns rows, typically a SELECT. The args are for any placeholder parameters in the query.

func (*DB) Exec

Exec executes a query without returning any rows. The args are for any placeholder parameters in the query.

huangapple
  • 本文由 发表于 2016年3月16日 03:42:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/36020664.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定