Go语言 如何区分字符串和非字符串(函数调用、数字)?

t40tm48m  于 2023-03-10  发布在  Go
关注(0)|答案(1)|浏览(114)

我正在go中编写一个工具,它主要跟踪数据库更改,并生成自应用程序上次运行以来发生的更改的SQL。我完全理解可能有更好的方法来实现这一点,但我只是将其作为一种学习经验。
假设执行以下查询:

SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = "my_db";

我意识到,如果我想得到COLUMN_DEFAULT的精确表示,我需要区分NULL作为一个值和COLUMN_DEFAULT列中的一个随机字符串,所以我使用sql.NullString来实现这一点:

rows, err := conn.Query(...)

for rows.Next() {
    var columnDefault sql.NullString

    _ = rows.Scan(..., ..., &columnDefault)

    // Not null:
    // Could be a string e.g. Hello, World! 
    // Could be a function call e.g. CURRENT_TIMESTAMP()
    // Could be a number e.g. 1
    // So you the following would not be valid
    if columnDefault.Valid {
        columnDefault = "'" + columnDefault + "'"   
    }
}

但是,我再次意识到,我还需要区分字符串和COLUMN_DEFAULT中的其他数据类型/值,例如COLUMN_DEFAULT = CURRENT_TIMESTAMP()COLUMN_DEFAULT = 1COLUMN_DEFAULT = Some random string...
那么,有没有一种原生的方法可以区分字符串和非字符串(例如,函数调用、数字等,我不会引用)

lc8prwob

lc8prwob1#

如果COLUMN_TYPE是行的类型,我想你可以在go代码中检查它的值,最好的解决方案是保存类型,然后检查它是什么,但是通常你不想在varchar列中放置不同类型的数据。
如果要使sql查询不返回NULL值,请在分号之前的末尾添加AND COLUMN_DEFAULT IS NOT NULL

相关问题