sails.js - I want to add DB connection dynamically after sails lift

前端 未结 3 1948
庸人自扰
庸人自扰 2020-12-06 07:36

During sails lift I don\'t yet have all the connection information for my DB.

Is there a way to either have config values dependent on promises or dynamically creat

相关标签:
3条回答
  • 2020-12-06 08:09

    I have found a workaround for MySql DB

    Important: In my case, I will be changing database but all database would have the same schema only difference is in their name and data they contain and make sure to add any error handling you need

    In config/connection.js -------- disable Pooling

     mysql_database: {
       adapter: 'sails-mysql',
       host: 'localhost',
       user: 'root', //optional
       password: '12345', //optional
       database: 'db1', //optional
       pool: false
     },
    

    Now navigate to

    node_modules/sails-mysql/lib/connections/spawn.js

    Add connectionObject.config = sails.SwitchDbConfig

    connectionObject.config = sails.SwitchDbConfig
    
    var conn = mysql.createConnection(connectionObject.config);
      conn.connect(function (err) {
        afterwards(err, conn);
      });
    

    Now Finally Set sails.SwitchDbConfig form anywhere (service , controller ,etc) as

    sails.SwitchDbConfig = { 
                pool: false,
                connectionLimit: 5,
                waitForConnections: true,
                adapter: 'sails-mysql',
                host: 'localhost',
                user: 'root',
                password: '12345',
                database: sails.DB_NAME,
                identity: 'mysql_database' 
              }
    

    And at last if you find something wrong for needs to be updated .... please ping

    0 讨论(0)
  • 2020-12-06 08:22

    Yes; two things in sails.js allow you to do this. One currently exists, and one is upcoming.

    1. https://github.com/sgress454/sails-hook-autoreload. This module watches for config file changes on disk and will re-load your ORM models when a file changes.

    2. I am working on this exact feature right now, and my plan is to publish my work at the end of next week. I agree that it will be very useful.

    The API will allow you to define new Models and Connections in the database on the fly. sails.js lifecycle callbacks handle updating the ORM and adapters and so forth. It is event-based and will allow you to manually fire events to update the ORM/Connections, like so:

    • sails.emit('hook:dynamic-orm:reload')

    Is this what you need?

    0 讨论(0)
  • 2020-12-06 08:31

    Update: In Sails v1.0 / Waterline v0.13, this can be accomplished by accessing the stateless, underlying driver; e.g. sails.getDatastore().driver. This can be used in any database adapter that supports the new stateless driver interface, including MySQL, PostgreSQL, and MongoDB.


    Prior to Sails v1.0, this was not officially supported in Sails or Waterline directly, but depending on your use case there are a couple of good solutions for this. If your use case is a handful of dynamic connections for the purpose of development (e.g. in an auto-reload plugin), and you're willing to live on the edge, you can take advantage of a private API as an immediate-term workaround: sails.hook.orm.reload(). However you definitely don't want to use that in production since it literally flushes the entire ORM.

    If you are going to be dealing with a larger number (let's say > 10 unique configurations) of runtime-dynamic datastore configurations during the lifetime of the running Node process, that's a different story. In that case, I would recommend using the relevant raw driver (e.g. https://github.com/felixge/node-mysql) to summon/release those dynamic connections from a pool directly via a service. You can still use your normal models in your app for connections which are static-- you will just be best off implementing dynamic database connections separately in your service. For example, if you were building a hosted version of phpMyAdmin you might use a lower-level NPM package to dynamically fetch information about users' tables, but you'd still probably want to have Account and Database models that refer to tables/collections stored in your own database.

    A more integrated solution for Sails is in the works. This ability to tap into the raw connection lifecycle and access it from userland is a prerequisite for built-in transaction support, which is something we expect to land in Sails/Waterline some time in the second half of 2016. In the mean time, if you encapsulate your logic to summon/release connections via service methods as suggested above, you'll have a working solution for now and your business logic should be more or less future proof (when you upgrade, you'll just need to swap out the implementation in your service). Hope that helps!

    0 讨论(0)
提交回复
热议问题