You're Invited:Meet the Socket Team at BlackHat and DEF CON in Las Vegas, Aug 4-6.RSVP
Socket
Book a DemoInstallSign in
Socket

como-sql-builder

Package Overview
Dependencies
Maintainers
1
Versions
16
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

como-sql-builder

基于适配器的SQL查询字符串生成器。完全控制SQL查询的构造。快速为您喜欢的数据库创建适配器(包括MySQL适配器)。设置位置条件,如果您的应用程序改变主意,稍后将其删除:)

1.1.5
latest
npmnpm
Version published
Weekly downloads
0
-100%
Maintainers
1
Weekly downloads
 
Created
Source

como-sql-builder

支持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);



Keywords

builder

FAQs

Package last updated on 12 Jun 2025

Did you know?

Socket

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.

Install

Related posts