Tag: orm

在sequelize.js中获得与belongsToMany的关联

我有一个用户和设备模型之间的多对多关系,通过UserDevice连接表: device.belongsToMany(user, { through: { model: userDevice }, foreignKey: "deviceId", as: "customers" }); user.belongsToMany(device, { through: { model: userDevice }, foreignKey: "customerId", as: "devices" }); setCustomers: Sequelize.BelongsToManySetAssociationsMixin<UserInstance, string, UserDeviceAttribute>; getCustomers: Sequelize.BelongsToManyGetAssociationsMixin<UserInstance>; 我可以通过以下方式正确find设备并填充客户: this.db.models.Device.findAll({ include: [{ model: User, as: "customers" }] 我不知道如何在其他情况下填充客户,即当我手动设置客户时。 现在我正在尝试类似于: return device.setCustomers(customers) .then(() => { return device.getCustomers(); }) .then((users) => { device.setAttributes("customers", users); […]

Bookshelf.js中的多重关系

我试图在node.js应用程序中使用bookshelf.js作为ORM到Postgresql来实现基于angular色的访问控制。 我有以下架构: USERS <- USERS_ROLES -> ROLES <- ROLES_RIGHTS -> RIGHTS 我希望能够获得用户拥有的所有权利。 在SQL中,我只是这样做: SELECT rights.* FROM rights INNER JOIN roles_rights ON roles_rights.right_id=rights.id INNER JOIN users_roles ON users_roles.role_id = roles_rights.role_id WHERE users_roles.user_id=1 GROUP BY rights.id 对于Bookshelf.js来说,这是一个相对较新的问题,但是在设置关系时遇到了一些麻烦。 这是我第一次尝试: const User = bookshelf.Model.extend({ tableName: 'users', roles: function() { return this.belongsToMany(Role, 'users_roles', 'user_id', 'role_id') }, rights: function() { return […]

sequelizejs:findAll并同时计算关联

说我有两个模型: Post和Comment ,现在我可以使用Post.findAll()获得所有职位,但我也需要每个职位的评论计数,我可以做一个循环,并使用post.countComments()获得计数,但是有可能在一个查询中做到这一点? 谢谢

应用程序端连接ORM的节点?

开始:我试过Loopback。 回送很好,但不允许跨多个REST数据服务的关系,而是调用初始数据服务,并传递查询参数来请求它执行连接的查询。 在我重新发明轮子并在Loopback的loopback-rest-connector上编写大量的包装器之前,我需要找出是否有任何现有的库或框架已经解决了这个问题。 到目前为止,我的广泛的谷歌search没有出现。 在真正的微服务环境中,每个数据库都有一个服务。 http://microservices.io/patterns/data/database-per-service.html 从这篇文章: 实现连接现在在多个数据库中的数据的查询是具有挑战性的。 有各种解决scheme: 应用程序端连接 – 应用程序执行连接而不是数据库。 例如,服务(或API网关)可以通过首先从客户服务中检索客户,然后查询订单服务以返回客户的最近订单来检索客户及其订单。 命令查询责任分离(CQRS) – 维护一个或多个包含来自多个服务的数据的物化视图。 这些视图由订阅每个服务在更新其数据时发布的事件的服务保存。 例如,在线商店可以通过维护join客户和订单的视图来实现查询特定地区的客户及其近期订单的查询。 该视图由订阅客户和订单事件的服务更新。 例: 我有2个数据微服务: GET / pets – 返回一个对象 { "name":"ugly", "type":"dog", "owner":"chris" } 和完全不同的微服务…. GET /所有者/ {OWNER_NAME} – 返回所有者信息 { "owner":"chris", "address":"under a bridge", "phone":"123-456-7890" } 我有一个API级别的微服务将要调用这两个数据服务。 这是我将应用于此的微服务。 我希望能够build立一个宠物模型,这样,当我查询宠物,GET /宠物的成功回应,它将与所有者“join”(发送GET /所有者/ {OWNERS_NAME}所有的回应)和用户,只需返回包含其所有者数据的宠物列表。 所以GET /宠物(也许像Pets.find())会返回 { "name":"ugly", "type":"dog", […]

如何获得一个模型的目标,这是一个由其他两个模型使用的模型?

说我有模型A belongsToMany模型B通过模型C,模型C belongsTo模型D.如果我有一个ID为A,有什么是最好的方式来获得模型D有关的模型A包括A和B? 我认为这是数据库ERdevise的一个普遍背景。 D是一个实体,它与实体A和实体B的关系C有关。 我们可以像这样获得C的正常属性。 A.findById(id,{include:[{model:B, through:{attributes:[…]}}]). 显然,我们不能像上面那样得到目标模型D. 我试过了 A.findById(id,{include:[{model:B, through:{model:C, include:[model:D]}}]) 它没有工作。

sequelize.js关系validation

想象一下,我有两个模型: var Movie = sequelize.define('movies', { /* model definition */ }) var Genre = sequelize.define('genres', { /* model definition */ }); Movie.hasMany(Genre); Genre.hasMany(Movie); 如果我想规定一部电影至less要有一个types,那我该怎么做呢? 我已经看到了明显的地方。 我最初的想法是build(),validate()和save(),但是查看源.validate()只适应模型定义中定义的字段。 例如 Genre.find({where:{'name':'horror}) .success(function (horrorGenre) { var movie = Movie.build({..}); movie.addGenre(horrorGenre); if (! movie.validate()) { // This doesn't consider related data movie.save(); } }); 所以我想我需要实现某种自定义validation机制,但我不完全确定从哪里开始。 注意我正在维护我自己的Sequelize分支,所以这更像是一个问题,我可能会如何修改Sequelize源代码来完成我想要的工作,而不是将它们拼凑在一起。

Cassandra Node.js ORM最佳实践

目前,我们正在使用cassandra驱动程序,执行标准查询,并在我们的DAL和BL图层中访问“原始”结果。 我们的应用程序应该支持数百万用户,每个请求的平均剂量为3读取数据库,我们有大约30个模型。 我们正在考虑使用某种ORM库,将模型映射到我们自己的模型中,并且将每个原始数据处理为一个代表性的对象,或者处理每个模型(原始数据)的获取,设置和创build的简单函数。 我们的用例是封装“原始”数据结构的处理,避免代码重复,防止模式结构错误和强制validation。 我们非常想知道对性能的影响,未来的灵活性以及ORM lib / framworks的普及程度。 在这个主题中获得最佳实践(和参考)是有帮助的,因为我们不知道使用ORM层比cassandra有什么影响。

当使用bookshelf的时候,得到“不能读取属性'toString'的undefined”

我有一套看起来像这样的Bookshelf模型: const User = bookshelf.Model.extend({ tableName: 'users', hasTimestamps: true, posts: function() { return this.hasMany(Posts); }, }); const Posts = bookshelf.Model.extend({ tableName: 'posts', hasTimestamps: true, author: function() { return this.belongsTo(User); }, }); 使用knex,我像这样设置模式: Promise.all([ knex.schema.createTableIfNotExists('users', (tbl) => { tbl.increments('id').primary(); tbl.string('name'); tbl.string('username'); tbl.string('email'); tbl.timestamps(); }), knex.schema.createTableIfNotExists('posts', (tbl) => { tbl.increments(); tbl.string('title'); tbl.string('body'); tbl.integer('author').references('users.id'); tbl.timestamps(); }) ]); 当我然后运行下面的服务器路线devise来获取一个职位: […]

正确查询基于查找所有对象有很多关系

你好,我遇到了一个问题,find最好的解决scheme,find并计算所有可用于预订的汽车。 我的意思是车模和预约模型之间有这样的关系: Reservation.belongsTo(Car); Car.hasMany(Reservation, {foreignKey: { allowNull: false }}); 然后,我需要find所有可供用户在他/她select的时间段内预定的车辆。 例如,让我们想象一下这样的情况:我们有3辆车,A,B,C和: 汽车 – 答:现在有两个保留 – 从2016年10月10日至2016年10月13日和从17.10.2016 – 18.10.2016 车B:有一个保留 – 8.10.2016 – 11.10.2016 车C:一次预约 – 15.10.2016 – 16.10.2016 用户希望从12.10.2016至16.10.2016预定一辆车。 因此,他只能得到一辆车select:汽车乙 我创build了这样的查询来得到这个结果: var results = await Car.findAndCountAll({ include: [{ model: Reservation, where: { $not: { $or: [ { dateIn: { $between: [chosenIn, chosenOut], } }, { […]

Sequelize:根据请求在运行时连接到数据库

我正在做一个node.js应用程序,我需要连接到多个数据库。 其中一个数据库是中央数据库,其中包含所有人共同的信息。 然后有根据国家储存数据的国家级数据库。 我在应用程序中使用续集ORM。 数据库是postgresql。 框架是明确的。 问题是我想根据请求使用哪个数据库来决定运行时间,模型应该自动连接到适当的数据库。 我已经看到这个问题,但没有发现它有帮助。 我也检查了另一个论坛,但没有发现任何东西。