【问题标题】:Apply Sqlite/Any SQL Database Migrations with Electron [Windows, Mac]使用 Electron 应用 Sqlite/任何 SQL 数据库迁移 [Windows, Mac]
【发布时间】:2019-02-14 02:42:49
【问题描述】:

我的情景,

我正在开发基于桌面的应用程序。我最大的挑战是将数据保存到关系数据库(离线)并相应地同步(公司有自己的同步算法)。我使用 ElectronVueJS 作为客户端。为了构建桌面应用程序,我使用 electron-builder。我能够使用原始 SQL 或各种 ORM 编写迁移。

我想要什么?

虽然我将安装到桌面,但我想创建数据库文件并在客户端计算机上应用所有迁移。我只是不知道那部分如何做到这一点。我还调查了Electron Builder Docs。但是没看懂。我需要一个例子,任何想法。

请帮助我。谢谢

【问题讨论】:

  • 您有没有机会为此找到解决方案?
  • 还是不行。没有找到解决这个问题的好方法。如果您面临同样的问题?当您解决时,请在此处给出解决方案。我只是持有这个项目几个月。谢谢
  • 我会的。但目前为了取得进展,我正在使用服务器端实现(Laravel + mySQL)来管理我最初打算存储在本地的数据。我以前使用过带有电子的 sqlite,但在几个方面感觉不对。许多 ORM 模块要么已弃用,要么功能缺失,要么没有集成迁移管理。因此我现在使用 Laravel。
  • 就我而言,我将 PostgreSQL 与 Python 一起使用。但我也需要客户端存储。客户非常想离线工作。所以,没有办法逃避我的计划。

标签: javascript electron database-migration electron-builder electron-vue


【解决方案1】:

经过大量研究,我发现 sequalize.js 提供了一个很棒的解决方案。我找到了一个图书馆Umzug Github。让我们看看实现...


    /**
     * Created by Ashraful Islam
     */

    const path = require('path');
    const Umzug = require('umzug');
    const database = /* Imported my database config here */;

    const umzug = new Umzug({
        storage: 'sequelize',
        storageOptions: {
            sequelize: database
        },

        // see: https://github.com/sequelize/umzug/issues/17
        migrations: {
            params: [
                database.getQueryInterface(), // queryInterface
                database.constructor, // DataTypes
                function () {
                    throw new Error('Migration tried to use old style "done" callback. Please upgrade to "umzug" and return a promise instead.');
                }
            ],
            path: './migrations',
            pattern: /\.js$/
        },

        logging: function () {
            console.log.apply(null, arguments);
        }
    });

    function logUmzugEvent(eventName) {
        return function (name, migration) {
            console.log(`${name} ${eventName}`);
        }
    }
    function runMigrations() {
        return umzug.up();
    }

    umzug.on('migrating', logUmzugEvent('migrating'));
    umzug.on('migrated', logUmzugEvent('migrated'));
    umzug.on('reverting', logUmzugEvent('reverting'));
    umzug.on('reverted', logUmzugEvent('reverted'));

    module.exports = {
        migrate: runMigrations
    };

幕后创意
我明确声明了迁移目录。此外,定义文件匹配模式。 Umzug 只是从那里读取文件并运行数据库迁移。下面是一个示例迁移文件...

// 000_Initial.js

"use strict";

module.exports = {

    up: function(migration, DataTypes) {

        return migration.createTable('Sessions', {

            sid: {
                type: DataTypes.STRING,
                allowNull: false
            },

            data: {
                type: DataTypes.STRING,
                allowNull: false
            },

            createdAt: {
                type: DataTypes.DATE
            },

            updatedAt: {
                type: DataTypes.DATE
            }

        }).then(function() {
            return migration.addIndex('Sessions', ['sid']);

        });

    },

    down: function(migration, DataTypes) {
        return migration.dropTable('Sessions');
    }

};

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2017-08-27
    • 2021-09-21
    相关资源
    最近更新 更多