英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论