在一个应用程序中,我有一个全局范围
var db *sql.DB
后来被称为
slcstrSource, slcint64Timestamp, slcstrContent, err := DB_functions.GetContent(db)
if err != nil {
fmt.Println("Error: " + err.Error())
}
GetContent是这样的:
func GetContent(db *sql.DB) ([]string, []int64, []string, error) {
var slcstrContent []string
var slcint64Timestamp []int64
var slcstrSource []string
// Run the query
rows, err := db.Query("SELECT source, timestamp, content FROM MyDatabase.MyTable")
if err != nil {
return slcstrSource, slcint64Timestamp, slcstrContent, err
}
defer rows.Close()
for rows.Next() {
// Holding variables for the content in the columns
var source, content string
var timestamp int64
// Get the results of the query
err := rows.Scan(&source, ×tamp, &content)
if err != nil {
return slcstrSource, slcint64Timestamp, slcstrContent, err
}
// Append them into the slices that will eventually be returned to the caller
slcstrSource = append(slcstrSource, source)
slcstrContent = append(slcstrContent, content)
slcint64Timestamp = append(slcint64Timestamp, timestamp)
}
return slcstrSource, slcint64Timestamp, slcstrContent, nil
}
当我运行该应用程序并且命中了这些代码段时,我得到:
Error: mssql: Invalid object name 'MyDatabase.MyTable'.
当我使用db.Ping()数据库时,它似乎可以工作。从我缩小的范围来看,错误是在查询中发生的,但是我找不到错误所在。我检查了数据库,然后有一个名为MyDatabase的数据库和一个名为MyTable的表,并且该表在这三列中都有信息...
在进行查询之前或进行查询时,我缺少什么吗?
最佳答案
似乎驱动程序正在按应有的方式工作。为了在SQL Server中查询表,您应该使用[Database].[Schema].[TableName]
。如果尚未为表定义特定的架构名称,则默认情况下将在dbo
架构下创建该名称。
不用说,您实际上不需要在查询中指定数据库名称。您宁可在连接字符串上定义它。我不确定您如何定义连接详细信息,但请查看下面的内容并相应地适应您的需求。
var (
debug = flag.Bool("debug", false, "enable debugging")
password = flag.String("password", "mypwd", "the database password")
port *int = flag.Int("port", 1433, "the database port")
server = flag.String("server", "MyServer", "the database server")
user = flag.String("user", "MyUser", "the database user")
connStr = fmt.Sprintf("server=%s;Initial Catalog=MySchema;userid=%s;password=%s;port=%d", *server, *user, *password, *port)
)
func main() {
db, err := sql.Open("mssql", connStr)
}
然后,您可以像这样查询表:
rows, err := db.Query("SELECT source, timestamp, content FROM MySchema.MyTable")