我正在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
= 1
或COLUMN_DEFAULT
= Some random string...
那么,有没有一种原生的方法可以区分字符串和非字符串(例如,函数调用、数字等,我不会引用)
1条答案
按热度按时间lc8prwob1#
如果
COLUMN_TYPE
是行的类型,我想你可以在go代码中检查它的值,最好的解决方案是保存类型,然后检查它是什么,但是通常你不想在varchar
列中放置不同类型的数据。如果要使sql查询不返回NULL值,请在分号之前的末尾添加
AND COLUMN_DEFAULT IS NOT NULL
。