我是第一次使用nodejs mssql /乏味库。我有一个表,该表使用列的默认值,并且我不能指望日志总是显示所有这些值。我想知道是否有一种更简单的方法,可以根据将值传递给我的日志函数来安全地动态构建查询。
const sql = require('mssql')
const config = require('config')
const dconfig = config.database
const addLog = async (options) => {
const { text, sentSuccess, isError } = options
try {
let pool = await sql.connect(dconfig)
let request = await pool.request()
request.input('message', sql.Text, text.trim())
if (sentSuccess) {
request.input('sent', sql.Bit, !!parseInt(sentSuccess))
await request.query('insert into dbo.MApp_Logs (message, sent_success) values (@message, @sent)')
} else {
await request.query('insert into dbo.MApp_Logs (message) values (@message)')
}
} catch (err) {
throw err
} finally {
sql.close()
}
}
您可以看到,在这里我不得不根据存在的值多次重写查询。是否有更优雅的方式来处理此问题而不将值连接到字符串中?
答案 0 :(得分:1)
除了向后兼容之外,我真的不喜欢在SQL中使用或依赖DEFAULT
约束。但这是个人品味和偏好的问题。我希望在代码中处理默认值以进行新工作,并始终发送相同的SQL语句:
request.input('message', sql.Text, text.trim())
if (sentSuccess)
request.input('sent', sql.Bit, !!parseInt(sentSuccess))
else
request.input('sent', sql.Bit, theDefaultValue)
await request.query('insert into dbo.MApp_Logs (message, sent_success) values (@message, @sent)')
但是,如果您确实要使用SQL的默认定义,则可以始终使用sql语句并继续进行参数设置:
request.input('message', sql.Text, text.trim())
let sqlFields = "insert into dbo.MApp_Logs (message"
let sqlValues = ") values (@message"
if (sentSuccess) {
request.input('sent', sql.Bit, !!parseInt(sentSuccess))
sqlFields += ", sent_success"
sqlValues += ", @sent"
}
await request.query(sqlFields + sqlValues + ")")