英文:
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
来创建一个表。请查看这些函数的文档:
Query函数执行返回行的查询,通常是SELECT语句。args参数用于查询中的任何占位符参数。
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:
Query executes a query that returns rows, typically a SELECT. The args are for any placeholder parameters in the query.
Exec executes a query without returning any rows. The args are for any placeholder parameters in the query.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论