
Product
Introducing Scala and Kotlin Support in Socket
Socket now supports Scala and Kotlin, bringing AI-powered threat detection to JVM projects with easy manifest generation and fast, accurate scans.
como-sql-builder
Advanced tools
基于适配器的SQL查询字符串生成器。完全控制SQL查询的构造。快速为您喜欢的数据库创建适配器(包括MySQL适配器)。设置位置条件,如果您的应用程序改变主意,稍后将其删除:)
支持mysql、sqlite3 原生typescript 实现,无任何依赖库,方便实用
实现此库的主要目的是在mysql和sqlite3数据库切换时类型转换不兼容的情况 此库的数据类型验证比较宽松,实现了 Sequelize 的70%的功能
手工构建SQL语句并不有趣,尤其是在一种对多行字符串支持笨拙的语言中
让我们用JavaScript来构建它
$ npm install como-sql-builder
import { FindOptions, WhereOptions } from "../types/application";
import { SQLBuilderException, ColumnProperty } from "./core/BaseBuilder";
import { Op } from "./core/operators";
import { SqlBuilder } from "./main";
//自定义回调场景转换或验证函数
//这是只展示了转换函数
//如果需要验证 可以在函数内部验证
const md5 = function(value:string,data:object,scene:string) {
if(value != "1234") throw new SQLBuilderException("数据验证未通过,请检查数据是否正确");
if(scene == "insert") {
return `${value}helloworld`;
}
return value;
}
class AdminUserPipe {
@ColumnProperty()
//ColumnProperty({convert:Fn})
//此处的Number是内定的转换函数 也是可以自定义转换函数
//会回调三个参数(value,data,scene)
// value 当前字段的值
// data 整个对象的值
// scene 使用场景 当前只支持insert和update
//如果没有装饰器 则在插入数据 查询数据 更新数据中忽略该字段
//但前题是必须要使用这个使用 没有使用此类无效
admin_id?: number;
@ColumnProperty()
username?: string;
// @ColumnProperty({convert:Fn})
@ColumnProperty()
password?: string;
@ColumnProperty()
admin_status?:number
@ColumnProperty()
role_id?:number
@ColumnProperty({
insertDefaultValue:"192.168.18.99"
})
login_ip?:number
}
// class RolesPipe {
// role_id?:number
// role_desc?:string
// role_name?:string
// role_flag?:string | number
// admin_id?:number
// create_time?:string
// }
const builder = SqlBuilder.Ins({prefix:"szj_"});
//查询语句
/**
* 返回示例:
* SELECT `SzjAdminUser`.`admin_id`,`SzjAdminUser`.`username`,`SzjAdminUser`.`password`,`SzjAdminUser`.`admin_status`,`SzjAdminUser`.`role_id`,`role`.`role_name` AS `role_name` FROM `szj_admin_user` AS `SzjAdminUser` LEFT JOIN `szj_admin_user` AS `au` ON `SzjAdminUser`.`action_user` = `au`.`admin_id` LEFT JOIN `szj_roles` AS `role` ON `SzjAdminUser`.`role_id` = `role`.`role_id` ORDER BY `SzjAdminUser`.`admin_id` DESC
*/
const selectSQL = builder.Builder({cls:AdminUserPipe}).Table("admin_user").FindAll({
include:[
{table:'admin_user',as:'au',attributes:[],condition:{
foreignKey:"action_user",targetKey:'admin_id'
}},
{table:"roles",as:'role',attributes:["role_name"],condition:{
foreignKey:'role_id',targetKey:'role_id'
}}
],
attributes:{
include:[["au.username","action_username"]],
exclude:["login_time","login_count"]
},order:[["admin_id","desc"]]
} as FindOptions<object>);
//插入语句
/**
* 返回示例:
* INSERT INTO `szj_admin_user` (`username`,`password`,`role_id`) VALUES ("como","123456",1)
*/
const insertSQL = builder.Builder({cls:AdminUserPipe}).Table("admin_user").Insert<AdminUserPipe>({
username:"como",
password:"123456",
role_id:"1",
});
//占位符插入
/**
* 返回示例:
* [
'INSERT INTO `szj_admin_user` (`username`,`password`,`role_id`) VALUES ($0,$1,$2)',
[ 'como', '123456', 1 ]
]
*/
const insertValSql = builder.Builder({cls:AdminUserPipe}).Table("admin_user").InsertVal({
username:"como",
password:"123456",
role_id:1,
});
//更新语句
/**
* 返回示例:
* UPDATE `szj_admin_user` SET `password` = "12345678",`admin_status` = 1 WHERE ( `admin_id` = 38 )
*/
const updateSQL = builder.Builder({cls:AdminUserPipe}).Table("admin_user").Update<AdminUserPipe>({
password:"12345678",admin_status:1
},{where:{admin_id:38}});
//更新语句
/**
* 返回示例:
* [
'UPDATE `szj_admin_user` SET `password` = $0,`admin_status` = $1 WHERE ( `admin_id` = 38 )',
[ '12345678', 1 ]
]
*/
const updateValSQL = builder.Builder({cls:AdminUserPipe}).Table("admin_user").UpdateVal({
password:"12345678",admin_status:1,action_user:1,login_count:10
},{where:{admin_id:38}});
//删除语句
/**
* 返回示例:
* DELETE FROM `szj_admin_user` WHERE ( `admin_id` = 38 )
*/
const deleteSql = builder.Builder({cls:AdminUserPipe}).Table("admin_user").Delete<AdminUserPipe>({
where:{admin_id:38}
});
//统计语句查询
/**
* 返回示例:
* SELECT count(`SzjArticles`.`admin_id`) AS `count` FROM `szj_articles` AS `SzjArticles`
*/
const countSql = builder.Builder().Table("articles").Count({col:"admin_id"});
//查询并统计所有数据
/**
* 返回示例:
* SELECT count(*) AS `count` FROM `szj_admin_user` AS `SzjAdminUser` LEFT JOIN `szj_admin_user` AS `au` ON `SzjAdminUser`.`action_user` = `au`.`admin_id`
* SELECT `SzjAdminUser`.`admin_id`,`SzjAdminUser`.`username`,`SzjAdminUser`.`password`,`SzjAdminUser`.`admin_status`,`SzjAdminUser`.`role_id` FROM `szj_admin_user` AS `SzjAdminUser` LEFT JOIN `szj_admin_user` AS `au` ON `SzjAdminUser`.`action_user` = `au`.`admin_id`
*/
const [AllCountSql,AllDataSql] = builder.Builder({cls:AdminUserPipe}).Table("admin_user").FindAndCountAll({
attributes:{
exclude:['create_time']
},
include:[
{table:"admin_user",as:'au',attributes:[],condition:{
foreignKey:"action_user",targetKey:'admin_id'
}}
]
});
//使用函数
/**
* 返回示例:
* SELECT `SzjArticles`.`article_id`,`SzjArticles`.`article_title`,`SzjArticles`.`create_time`,FROM_UNIXTIME(UNIX_TIMESTAMP(`create_time`)) AS `create_at_time` FROM `szj_articles` AS `SzjArticles`
*/
const fnSql = builder.Builder().Table("articles").FindAll({
attributes:[
"article_id","article_title","create_time",
[builder.Fn("FROM_UNIXTIME","UNIX_TIMESTAMP","create_time"),"create_at_time"],
]
});
//无参数查询
/**
* 返回示例:
* [
'SELECT count(*) AS `count` FROM `szj_admin_user` AS `SzjAdminUser` LEFT JOIN `szj_admin_user` AS `au` ON `SzjAdminUser`.`action_user` = `au`.`admin_id`',
'SELECT `SzjAdminUser`.`admin_id`,`SzjAdminUser`.`username`,`SzjAdminUser`.`password`,`SzjAdminUser`.`admin_status`,`SzjAdminUser`.`role_id` FROM `szj_admin_user` AS `SzjAdminUser` LEFT JOIN `szj_admin_user` AS `au` ON `SzjAdminUser`.`action_user` = `au`.`admin_id`'
]
*/
const notParamsSql = builder.Builder({cls:AdminUserPipe}).Table("admin_user").FindAndCountAll({
include:[
{table:"admin_user",as:'au',attributes:[],condition:{
foreignKey:'action_user',targetKey:'admin_id'
}}
]
});
//单条查询
/**
* 返回示例:
* SELECT `SzjAdminUser`.`admin_id`,`SzjAdminUser`.`username`,`SzjAdminUser`.`password`,`SzjAdminUser`.`admin_status`,`SzjAdminUser`.`role_id` FROM `szj_admin_user` AS `SzjAdminUser` WHERE ( `SzjAdminUser`.`admin_id` > 5 AND `SzjAdminUser`.`admin_id` < 30 ) LIMIT 1
*/
const FindOneSql = builder.Builder({cls:AdminUserPipe}).Table("admin_user").FindOne<AdminUserPipe>({
where:{
[Op.and]:[
{admin_id:{[Op.gt]:5}} as WhereOptions<AdminUserPipe>,
{admin_id:{[Op.lt]:30}} as WhereOptions<AdminUserPipe>
],
// [Op.or]:[
// {admin_id:{[Op.gt]:5}} as WhereOptions<AdminUserPipe>,
// {admin_id:{[Op.lt]:30}} as WhereOptions<AdminUserPipe>
// ]
}
});
const insertAllSql = builder.Builder({cls:AdminUserPipe}).Table("admin_user").InsertAll([
{username:"szjcomo",role_id:1,password:"szjcomo"},
{username:"szjcomo123",role_id:3,password:"szjcomo123"},
]);
console.log('selectSQL',selectSQL);
console.log('insertSQL',insertSQL);
console.log('insertValSql',insertValSql);
console.log('updateSQL',updateSQL);
console.log('updateValSQL',updateValSQL);
console.log('deleteSql',deleteSql);
console.log('countSql',countSql);
console.log('AllCountSql',AllCountSql);
console.log('AllDataSql',AllDataSql);
console.log('fnSql',fnSql);
console.log('notParamsSql',notParamsSql);
console.log('FindOneSql',FindOneSql);
console.log('insertAllSql',insertAllSql);
FAQs
基于适配器的SQL查询字符串生成器。完全控制SQL查询的构造。快速为您喜欢的数据库创建适配器(包括MySQL适配器)。设置位置条件,如果您的应用程序改变主意,稍后将其删除:)
The npm package como-sql-builder receives a total of 0 weekly downloads. As such, como-sql-builder popularity was classified as not popular.
We found that como-sql-builder demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Socket now supports Scala and Kotlin, bringing AI-powered threat detection to JVM projects with easy manifest generation and fast, accurate scans.
Application Security
/Security News
Socket CEO Feross Aboukhadijeh and a16z partner Joel de la Garza discuss vibe coding, AI-driven software development, and how the rise of LLMs, despite their risks, still points toward a more secure and innovative future.
Research
/Security News
Threat actors hijacked Toptal’s GitHub org, publishing npm packages with malicious payloads that steal tokens and attempt to wipe victim systems.