用JavaScript来构建SQL语句手动生成 SQL 语句是没有乐趣的

用于节点的 sql 字符串生成器 - 支持 PostgreSQL、mysql、微软 SQL Server、Oracle 和 sqlite 方言。P0C码友部落

手动生成 SQL 语句是没有乐趣的,尤其是在对多行字符串支持笨拙的语言中。P0C码友部落

因此,让我们用JavaScript来构建它。     P0C码友部落

也许它仍然不好玩,但至少它不那么有趣P0C码友部落

P0C码友部落
安装

$ npm install sql

P0C码友部落
使用

 
//require the moduleP0C码友部落
var sql = require('sql');P0C码友部落
 P0C码友部落
//(optionally) set the SQL dialectP0C码友部落
sql.setDialect('postgres');P0C码友部落
//possible dialects: mssql, mysql, postgres (default), sqliteP0C码友部落
 P0C码友部落
//first we define our tablesP0C码友部落
var user = sql.define({P0C码友部落
  name: 'user',P0C码友部落
  columns: ['id', 'name', 'email', 'lastLogin']P0C码友部落
});P0C码友部落
 P0C码友部落
var post = sql.define({P0C码友部落
  name: 'post',P0C码友部落
  columns: ['id', 'userId', 'date', 'title', 'body']P0C码友部落
});P0C码友部落
 P0C码友部落
//now let's make a simple queryP0C码友部落
var query = user.select(user.star()).from(user).toQuery();P0C码友部落
console.log(query.text); //SELECT "user".* FROM "user"P0C码友部落
 P0C码友部落
//something more interestingP0C码友部落
var query = userP0C码友部落
    .select(user.id)P0C码友部落
    .from(user)P0C码友部落
    .where(P0C码友部落
      user.name.equals('boom').and(user.id.equals(1))P0C码友部落
    ).or(P0C码友部落
      user.name.equals('bang').and(user.id.equals(2))P0C码友部落
    ).toQuery();P0C码友部落
 P0C码友部落
//query is parameterized by defaultP0C码友部落
console.log(query.text); P0C码友部落
//SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) P0C码友部落
AND ("user"."id" = $2)) OR (("user"."name" = $3) AND ("user"."id" = $4)))P0C码友部落
 P0C码友部落
console.log(query.values); //['boom', 1, 'bang', 2]P0C码友部落
 P0C码友部落
//queries can be namedP0C码友部落
var query = user.select(user.star()).from(user).toNamedQuery('user.all');P0C码友部落
console.log(query.name); //'user.all'P0C码友部落
 P0C码友部落
//how about a join?P0C码友部落
var query = user.select(user.name, post.body)P0C码友部落
  .from(user.join(post).on(user.id.equals(post.userId))).toQuery();P0C码友部落
 P0C码友部落
console.log(query.text); P0C码友部落
//'SELECT "user"."name", "post"."body" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")'P0C码友部落
 P0C码友部落
//this also makes parts of your queries composable, which is handyP0C码友部落
 P0C码友部落
var friendship = sql.define({P0C码友部落
  name: 'friendship',P0C码友部落
  columns: ['userId', 'friendId']P0C码友部落
});P0C码友部落
 P0C码友部落
var friends = user.as('friends');P0C码友部落
var userToFriends = userP0C码友部落
  .leftJoin(friendship).on(user.id.equals(friendship.userId))P0C码友部落
  .leftJoin(friends).on(friendship.friendId.equals(friends.id));P0C码友部落
 P0C码友部落
//and now...compose...P0C码友部落
var friendsWhoHaveLoggedInQuery = user.from(userToFriends).where(friends.lastLogin.isNotNull());P0C码友部落
//SELECT * FROM "user"P0C码友部落
//LEFT JOIN "friendship" ON ("user"."id" = "friendship"."userId")P0C码友部落
//LEFT JOIN "user" AS "friends" ON ("friendship"."friendId" = "friends"."id")P0C码友部落
//WHERE "friends"."lastLogin" IS NOT NULLP0C码友部落
 P0C码友部落
var friendsWhoUseGmailQuery = user.from(userToFriends).where(friends.email.like('%@gmail.com'));P0C码友部落
//SELECT * FROM "user"P0C码友部落
//LEFT JOIN "friendship" ON ("user"."id" = "friendship"."userId")P0C码友部落
//LEFT JOIN "user" AS "friends" ON ("friendship"."friendId" = "friends"."id")P0C码友部落
//WHERE "friends"."email" LIKE %1P0C码友部落
 P0C码友部落
//Using different property names for columnsP0C码友部落
//helpful if your column name is long or not camelCaseP0C码友部落
var user = sql.define({P0C码友部落
  name: 'user',P0C码友部落
  columns: [{P0C码友部落
      name: 'id'P0C码友部落
    }, {P0C码友部落
      name: 'state_or_province',P0C码友部落
      property: 'state'P0C码友部落
    }P0C码友部落
  ]P0C码友部落
});P0C码友部落
 P0C码友部落
//now, instead of user.state_or_province, you can just use user.stateP0C码友部落
console.log(user.select().where(user.state.equals('WA')).toQuery().text);P0C码友部落
// "SELECT "user".* FROM "user" WHERE ("user"."state_or_province" = $1)"

测试/方言文件夹中包含更多示例。如果您对使用情况有任何疑问,我们鼓励您通读!P0C码友部落

从命令行

您可以使用 sql 生成模块从数据库实例自动生成定义文件。P0C码友部落
P0C码友部落
例如,运行将生成类似于以下情况:
node-sql-generate --dsn "mysql://user:[email protected]/database"P0C码友部落

 
// autogenerated by node-sql-generate v0.0.1 on Tue May 21 2013 01:04:12 GMT-0700 (PDT)P0C码友部落
var sql = require('sql');P0C码友部落
 P0C码友部落
/**P0C码友部落
 * SQL definition for database.barP0C码友部落
 */P0C码友部落
exports.bar = sql.define({P0C码友部落
    name: 'bar',P0C码友部落
    columns: [P0C码友部落
        'id',P0C码友部落
        'foo_id'P0C码友部落
    ]P0C码友部落
});P0C码友部落
 P0C码友部落
/**P0C码友部落
 * SQL definition for database.fooP0C码友部落
 */P0C码友部落
exports.foo = sql.define({P0C码友部落
    name: 'foo',P0C码友部落
    columns: [P0C码友部落
        'id',P0C码友部落
        'field_1',P0C码友部落
        'foo_bar_baz'P0C码友部落
    ]P0C码友部落
});P0C码友部落
 P0C码友部落
/**P0C码友部落
 * Adding a column to an existing table:P0C码友部落
 */P0C码友部落
var model = sql.define({ name: 'foo', columns: [] });P0C码友部落
model.addColumn('id');P0C码友部落
 P0C码友部落
// If you try to add another column "id", node-sql will throw an error.P0C码友部落
// You can suppress that error via:P0C码友部落
model.addColumn('id', { noisy: false });

有关详细信息,请阅读模块的文档。P0C码友部落

贡献

我们喜欢捐款P0C码友部落

节点 sql 不会是任何东西, 没有所有的贡献者和合作者谁已经工作。如果您想成为合作者,以下是其完成:P0C码友部落
 P0C码友部落

以下是其完成:P0C码友部落

  1. 叉存储库
  2. git pull https://github.com/(your_username)/node-sql
  3. cd node-sql
  4. npm install
  5. npm test

此时,测试应该会通过。如果他们不通过,请打开一个输出的问题,或者你甚至可以直接给我发电子邮件。P0C码友部落
我的电子邮件地址在我的 github 个人资料上, 也在我的存储库中贡献的每个提交上。P0C码友部落

测试通过后,请根据需要进行修改。请确保编写测试以涵盖您的修改。准备好后,提交更改并提交拉取请求。P0C码友部落

只要您的拉取请求没有完全的墙外更改, 它确实有测试, 我们几乎总是合并它, 并推送到 npmP0C码友部落

如果您认为您的更改过于不公开,请打开问题或没有代码的拉取请求,以便我们可以在您开始之前讨论它们。P0C码友部落

通常,在一些高质量的拉取请求和友好的互动之后,我们很乐意与您分享协作权。P0C码友部落

毕竟,开源属于每一个人。P0C码友部落