节点 SQL
Node 的 sql 字符串生成器- 支持 PostgreSQL、mysql、Microsoft SQL Server、Oracle 和 sqlite 方言。
手动构建 SQL 语句并不有趣,尤其是对于对多行字符串的支持很笨拙的语言。
那么让我们用 JavaScript 来构建它。
也许还是不好玩,但至少少了一些不好玩。
安装
$ npm install sql
使用
//require the module
var sql = require('sql');
//(optionally) set the SQL dialect
sql.setDialect('postgres');
//possible dialects: mssql, mysql, postgres (default), sqlite
//first we define our tables
var user = sql.define({
name: 'user',
columns: ['id', 'name', 'email', 'lastLogin']
});
var post = sql.define({
name: 'post',
columns: ['id', 'userId', 'date', 'title', 'body']
});
//now let's make a simple query
var query = user.select(user.star()).from(user).toQuery();
console.log(query.text); //SELECT "user".* FROM "user"
//something more interesting
var query = user
.select(user.id)
.from(user)
.where(
user.name.equals('boom').and(user.id.equals(1))
).or(
user.name.equals('bang').and(user.id.equals(2))
).toQuery();
//query is parameterized by default
console.log(query.text); //SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) AND ("user"."id" = $2)) OR (("user"."name" = $3) AND ("user"."id" = $4)))
console.log(query.values); //['boom', 1, 'bang', 2]
//queries can be named
var query = user.select(user.star()).from(user).toNamedQuery('user.all');
console.log(query.name); //'user.all'
//how about a join?
var query = user.select(user.name, post.body)
.from(user.join(post).on(user.id.equals(post.userId))).toQuery();
console.log(query.text); //'SELECT "user"."name", "post"."body" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")'
//this also makes parts of your queries composable, which is handy
var friendship = sql.define({
name: 'friendship',
columns: ['userId', 'friendId']
});
var friends = user.as('friends');
var userToFriends = user
.leftJoin(friendship).on(user.id.equals(friendship.userId))
.leftJoin(friends).on(friendship.friendId.equals(friends.id));
//and now...compose...
var friendsWhoHaveLoggedInQuery = user.from(userToFriends).where(friends.lastLogin.isNotNull());
//SELECT * FROM "user"
//LEFT JOIN "friendship" ON ("user"."id" = "friendship"."userId")
//LEFT JOIN "user" AS "friends" ON ("friendship"."friendId" = "friends"."id")
//WHERE "friends"."lastLogin" IS NOT NULL
var friendsWhoUseGmailQuery = user.from(userToFriends).where(friends.email.like('%@gmail.com'));
//SELECT * FROM "user"
//LEFT JOIN "friendship" ON ("user"."id" = "friendship"."userId")
//LEFT JOIN "user" AS "friends" ON ("friendship"."friendId" = "friends"."id")
//WHERE "friends"."email" LIKE %1
//Using different property names for columns
//helpful if your column name is long or not camelCase
var user = sql.define({
name: 'user',
columns: [{
name: 'id'
}, {
name: 'state_or_province',
property: 'state'
}
]
});
//now, instead of user.state_or_province, you can just use user.state
console.log(user.select().where(user.state.equals('WA')).toQuery().text);
// "SELECT "user".* FROM "user" WHERE ("user"."state_or_province" = $1)"
test/dialects文件夹中包含更多示例。如果您对使用有任何疑问,我们鼓励您仔细阅读它们!
从命令行
您可以使用sql-generate 模块 从数据库实例自动生成定义文件。例如,运行node-sql-generate --dsn "mysql://user:password@host/database"
将生成类似以下内容的内容:
// autogenerated by node-sql-generate v0.0.1 on Tue May 21 2013 01:04:12 GMT-0700 (PDT)
var sql = require('sql');
/**
* SQL definition for database.bar
*/
exports.bar = sql.define({
name: 'bar',
columns: [
'id',
'foo_id'
]
});
/**
* SQL definition for database.foo
*/
exports.foo = sql.define({
name: 'foo',
columns: [
'id',
'field_1',
'foo_bar_baz'
]
});
/**
* Adding a column to an existing table:
*/
var model = sql.define({ name: 'foo', columns: [] });
model.addColumn('id');
// If you try to add another column "id", node-sql will throw an error.
// You can suppress that error via:
model.addColumn('id', { noisy: false });
阅读模块的文档以获取更多详细信息。
贡献
我们热爱贡献。
如果没有所有参与其中的贡献者和合作者TP钱包下载,node-sql 就不会成为任何东西。如果您想成为合作者,请按以下步骤操作:
- 分叉回购协议
git pull https://github.com/(your_username)/node-sql
cd node-sql
npm install
npm test
此时测试应该已通过。如果没有通过,请打开输出问题,或者您甚至可以直接向我发送电子邮件。我的电子邮件地址位于我的 github 个人资料上,也位于我在存储库中贡献的每个提交上。
测试通过后,根据您的需要进行修改。 请确保您编写测试来覆盖您的修改。准备好后,提交更改并提交拉取请求。
只要您的拉取请求没有完全超出常规的更改并且确实有测试,我们几乎总是会合并它并将其推送到 npm
如果您认为您的更改太离谱,请在没有代码的情况下提出问题或拉取请求,以便我们可以在开始之前进行讨论。
通常在一些高质量的拉取请求和友好的互动之后,我们会很乐意与您分享协作权利。
毕竟,开源属于每个人