当我写我的第一行JavaScript时,我从没想到它会超出浏览器脚本和制作交互式网站的范围。 我错了,因为JavaScript实际上可以在任何地方使用:
- 您可以在浏览器中使用它,而不必限于使用带有DOM API的ECMAscript。 诸如CoffeeScript和Dart之类的语言可以转换为普通的旧JavaScript,可以帮助您开发更快更好的代码。
- 您可以在服务器上使用它。 Node.js及其众多框架的数量正在增加,并帮助前端开发人员成为全栈开发人员。
- 您可以将其用于移动应用程序。 使用Cordova和Ionic或NativeScript之类的框架,您可以更快地构建移动应用程序,而无需了解其他语言,例如Java或Swift / Objective-C。 由于有了这些框架,您甚至可以在移动平台之间共享源代码。
- 您可以构建物联网。 SitePoint发布了Patrick Catanzariti的一些文章 ,可能对此很有帮助。
随着您所开发应用程序的复杂性不断提高,您将需要一些帮助您处理存储在数据库中的所有数据的方法,无论是在DB服务器(如PostgreSQL),移动设备的嵌入式SQLite中,或在浏览器中。 这就需要ORM。 Java社区具有Hibernate ,PHP开发人员可以使用Doctrine ORM ,而JavaScript社区具有自己的ORM。
在本文中,我将向您介绍一些JavaScript ORM,它们可以帮助您在下一个应用程序中处理复杂数据。
Bookshelf.js
Bookshelf.js是Node.js的ORM,旨在与PostgreSQL,MySQL,MariaDB和SQLite3配合使用。 它基于Knex SQL查询构建器构建,并遵循Backbone.js中看到的一些模式,例如模型和集合以及类似的命名约定。 如果您曾经使用过Backbone,则可能会很快适应书架。
要安装Bookshelf,您需要安装Knex以及一个DataBase驱动程序:
# get knex
$ npm install knex --save
# get bookshelf
$ npm install bookshelf --save
# get one of these DB drivers
$ npm install pg
$ npm install mysql
$ npm install mariasql
$ npm install sqlite3
安装它之后(确保传递--save
标志,以便将其添加到package.json
文件中),您可以像下面这样在Node.js应用程序中使用它:
var knexInstance = require('knex')({
client: 'mysql', // or what DB you're using
connection: {
host : '127.0.0.1',
user : 'scott',
password : 'tiger', // Scott's cat name
database : 'db_name',
charset : 'utf8'
}
});
// Initialize Bookshelf by passing the Knex instance
var bookshelf = require('bookshelf')(knexInstance);
var User = bookshelf.Model.extend({
tableName: 'users'
});
如您所见,通过传递Knex实例作为参数来创建书架对象。 然后,可以使用Model
的extend()
方法在应用程序中创建模型,就像上面示例中用于表users
的User
模型一样。 请记住, bookshelf
是您应在整个应用程序中使用的bookshelf
的唯一实例。 因此,最好在应用程序中的任何位置都可以访问它,例如将其包装为单例或放入其他文件中,并在需要时进行使用。
书架允许您建立一对一,一对多和多对多的关系。 在我们的情况下,它将类似于:
var User = bookshelf.Model.extend({
tableName: 'users',
posts: function() {
return this.hasMany(Post);
}
});
var Post = bookshelf.Model.extend({
tableName: 'posts',
user: function() {
return this.belongsTo(User);
}
});
如果您想看看它, 可以在GitHub上找到Bookshelf 。
续集
Sequelize是Node.js和io.js( 最终合并在一起 )的另一个ORM。 它支持PostgreSQL,MySQL,MariaDB,SQLite和MSSQL,并具有可靠的事务支持,关系,读取复制和
更多。 您可以通过运行以下命令来安装它:
# Install Sequelize
$ npm install --save sequelize
# Install the DB driver
$ npm install --save pg pg-hstore
# For both mysql and mariadb dialects
$ npm install --save mysql
$ npm install --save sqlite3
# MSSQL
$ npm install --save tedious
现在您可以使用它了,如下面的示例所示:
var Sequelize = require('sequelize');
var sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql'|'mariadb'|'sqlite'|'postgres'|'mssql', // use one of these
pool: {
max: 5,
min: 0,
idle: 10000
},
// SQLite only
storage: 'path/to/database.sqlite'
});
// Or you can simply use a connection uri
var sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');
就像Bookshelf.js一样,您只需要一个数据库连接即可。 之后,您可以创建一个模型,例如:
var User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING,
field: 'first_name' // `first_name` column matches User.firstName
},
lastName: {
type: Sequelize.STRING
}
}, {
freezeTableName: true // Model tableName (`user`) will be the same as the model name
});
上面的Sequelize.STRING
与SQL中的VARCHAR
匹配。 其他数据类型是Sequelize.INTEGER
为INTEGER
, Sequelize.BLOB
对BLOB
(或bytea
Postgres里)。 您可以在此处阅读完整列表 。
Sequelize允许您编写表之间的关系 。 例如,如果您有一个名为Project
的模型,另一个有称为Developer
的模型,并且想要为一个项目分配多个开发者,则可以这样进行:
Project.hasMany(Developer, {as: 'devs'})
这将确保在每个模型中添加必要的字段(在这种情况下,将project_id
到Developer模型)。 或者,如果您觉得无法从Sequelize API中获利,则可以运行原始SQL查询 。
爱情
Lovefield不是真正的ORM。 它实际上是Web应用程序的关系数据库,它建立在IndexedDB之上,由Google开发并完全用JavaScript编写。 它不支持原始SQL查询,但附带了一个试图模仿SQL语法的API。
您可以使用Bower安装它:
$ bower install lovefield --save
或npm :
$ npm install lovefield --save
将其添加到HTML文件中后,您可以开始将其用作前端关系数据库。 创建数据库和表很简单:
// create the database for a `To Do list`
var todoDB = lf.schema.create('todo_db', 1);
var item = todoDB.createTable('items')
.addColumn('id', lf.Type.INTEGER)
.addColumn('task', lf.Type.STRING)
.addColumn('deadline', lf.Type.DATE_TIME)
.addColumn('done', lf.Type.BOOLEAN)
.addPrimaryKey(['id']);
此代码段显示了如何创建具有给定列( id
为主键, task
, deadline
和done
)的数据库todo_db
和一个名为items
的表。 此时,要获得所有未完成任务的列表,代码将是:
todoDB.select()
.from(item)
.where(item.done.eq(false))
.exec(); // exec() returns a Promise
上面的代码与SQL非常相似,其中相同的查询为:
SELECT *
FROM todo_db.items
WHERE done = FALSE;
您也可以进行订购,如下所示:
todoDB.select()
.from(item)
.where(item.done.eq(false))
.orderBy(item.deadline, lf.Order.DESC) // order by deadline
.exec();
除了这些简单的查询,Lovefield还能够处理更复杂的查询,例如联接。 如果我在两个分别称为project
和developer
表中有引用(分别引用表projects
和developers
),并且想查看给定开发人员的所有项目,我会写:
db.select()
.from(developer, project)
.where(lf.op.and(
developer.projectId.eq(project.id),
developer.id.eq('12345')
))
.exec();
// these are both equivalent
db.select()
.from(developer)
.innerJoin(project, developer.projectId.eq(project.id))
.where(developer.id.eq('12345'))
.exec();
因此,您可以看到Lovefield充当IndexedDB之上的SQL层。 它还支持ACID事务(原子性,一致性,隔离性,持久性),限制和跳过(在分页时很有用),参数化查询等等。
与其他ORM一样,您可以从GitHub下载 Lovefield。
结论
SQL知识是每个开发人员都应该具备的技能,但是编写SQL查询很无聊,尤其是当那里有许多ORM时。 当它们简化您的工作时,为什么不首先使用它们呢? 在本文中,我介绍了到目前为止发布的一些最重要的ORM。 由于为每个示例提供了示例,您现在应该能够有意识地决定使用哪种示例以及哪种版本适合您的需求。
你呢? 您使用哪个JavaScript ORM? 在下面评论您的选择。
From: https://www.sitepoint.com/3-javascript-orms-you-might-not-know/