nodebatis
Version:
a sql style orm for nodejs
178 lines (160 loc) • 4.09 kB
JavaScript
/**
* sql builder
*/
const { escapeId } = require('sqlstring')
const _ = require('lodash')
const ops = {
'$eq': '=',
'$neq': '<>',
'$lt': '<',
'$lte': '<=',
'$gt': '>',
'$gte': '>=',
'$like': 'like',
'$in': 'in'
}
exports.getInsertSql = (tableName, data) => {
if (!tableName || !data) {
throw new Error('tableName or data is null')
}
let columns = [], params = [], holders = [], sql = ''
tableName = escapeId(tableName)
for (let key in data) {
columns.push(escapeId(key))
holders.push('?')
params.push(data[key])
}
columns = columns.join(',')
holders = holders.join(',')
sql = `insert into ${tableName} (${columns}) values (${holders})`
return { sql, params }
}
exports.getUpdateSql = (tableName, data, query) => {
if (!tableName || !data) {
throw new Error('tableName or data is null')
}
let sql = '', params = [], holders = []
let where = ''
tableName = escapeId(tableName)
for (let key in data) {
holders.push(`${escapeId(key)} = ?`)
params.push(data[key])
}
holders = holders.join(',')
if (query) {
let dataSql = getSqlFromObject(query)
where = `where ${dataSql.sql.join(' and ')}`
params = params.concat(dataSql.params)
}
sql = `update ${tableName} set ${holders} ${where}`
return { sql, params }
}
exports.getDelSql = (tableName, id, idKey = 'id') => {
if (!tableName) {
throw new Error('tableName is null')
}
tableName = escapeId(tableName)
if (idKey) {
idKey = escapeId(idKey)
let sql = `delete from ${tableName} where ${idKey} = ?`
return {
sql: sql,
params: [id]
}
} else {
let sql = `delete from ${tableName}`
return {
sql: sql,
params: []
}
}
}
const getSqlFromObject = data => {
let sql = [], params = []
for (let key in data) {
if (!_.isObject(data[key]) || _.isDate(data[key])) {
sql.push(`${escapeId(key)} = ?`)
params.push(data[key])
} else {
let opKeys = _.filter(_.keys(data[key]), s => s.indexOf('$') === 0)
for (let opKey of opKeys) {
if (opKey && ops[opKey]) {
if (opKey === '$in') {
let holders = data[key][opKey].map(o => '?')
sql.push(`${escapeId(key)} ${ops[opKey]} (${holders.join(',')})`)
for (let item of data[key][opKey]) {
params.push(item)
}
} else {
sql.push(`${escapeId(key)} ${ops[opKey]} ?`)
params.push(data[key][opKey])
}
}
}
}
}
return { sql, params }
}
exports.getSelectSql = (tableName, data, start, limit, orderBy, sort) => {
let sql = [], params = [], holders = []
let where = ''
tableName = escapeId(tableName)
sql.push(`select * from ${tableName}`)
if (data) {
where = 'where'
let dataSql = getSqlFromObject(data)
holders = holders.concat(dataSql.sql)
params = params.concat(dataSql.params)
}
holders = holders.join(' and ')
if (holders !== '') {
holders = [holders]
} else {
holders = []
}
if (orderBy) {
holders.push(`order by ${escapeId(orderBy)}`)
}
if (sort) {
if (sort === 'desc') {
holders.push('desc')
} else {
holders.push('asc')
}
}
if (/\d/.test(limit)) {
holders.push('limit ?')
params.push(limit)
if (/\d/.test(start)) {
holders.push('offset ?')
params.push(start)
}
}
if (where !== '') {
sql.push(where)
}
if (holders.length > 0) {
sql.push(holders.join(' '))
}
return { sql: sql.join(' '), params }
}
exports.getCountSql = (tableName, data) => {
let sql = [], params = [], holders = []
let where = ''
tableName = escapeId(tableName)
sql.push(`select count(*) count from ${tableName}`)
if (data) {
where = 'where'
let dataSql = getSqlFromObject(data)
holders = holders.concat(dataSql.sql)
params = params.concat(dataSql.params)
}
holders = holders.join(' and ')
if (where !== '') {
sql.push(where)
}
if (holders !== '') {
sql.push(holders)
}
return { sql: sql.join(' '), params }
}