我正在尝试做一个简单的事情,检查是否有一个表,如果没有,则在数据库中创建该表。

这是我使用的逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
    test :="June_2019"
    sql_query := `select * from ` + test + `;`

    read_err := db.QueryRow(sql_query, 5)
    error_returned := read_err.Scan(read_err)
    defer db.Close()

    if error_returned == nil {
        fmt.Println("table is there")

    } else {
        fmt.Println("table not there")
    }

在我的数据库中,我有June_2019表。 但是此代码仍返回我not nil值。 我使用db.QueryRow(sql_query, 5) 5的原因是表中有五个列。

我在这里想念什么? 我还在学习golang。

提前致谢。

  • 题外话;考虑使用应用程序代码创建表是否合乎逻辑,因为您的MySQL用户必须更强大才能拥有CREATE甚至DROP权限,这可能是不安全的。.还看到元数据(年份)用作表分隔符,您为什么这样做?理想情况下,您应该有一个表,其中有一个年份列
  • ..因为MySQL可以在一个表中处理数百万甚至数十亿条记录,但是只要涉及索引,并且在有疑问的情况下部署Partitioning时,它所做的或多或少与您正在做的相同,但是在各个方面都做得更好。
  • @RaymondNijland正确。但是在这里我这样做是为了学习golang并满足一个简单的需求。
  • SQL是一种语言。 go是一种语言。在尝试解决问题时,最好使用最适合手头任务的语言。检查表是否存在应该留给SQL方面,例如如果不存在则创建表
  • 有关表是否存在的SQL查询,请参见此答案。
  • 我知道这种sql语法可以解决问题。但是我问这个问题比mysql更特定于golang

我已经使用golang和MySQL解决了问题。

1
2
3
4
5
6
7
_, table_check := db.Query("select * from" + table +";")

    if table_check == nil {
        fmt.Println("table is there")
    } else {
        fmt.Println("table not there")
    }

我使用了db.Query()返回值和错误,这里我只检查了error

我想大多数人以为我想用MySQL的方式来做,我只是想学习如何使用golang来进行MySQL的操作。

  • 在table_check == nil的情况下,您忘记了rows.Close()(第一个返回变量),这很可能会泄漏内存