我正试图通过Sequelize.js ORM使用sqlite3初始化数据库。我已经定义了我的三个模型(让我们称它们为model1
、model2
和model3
(,现在我正在开发一个js文件,该文件将初始化和同步我的数据库
dbInit.js
看起来像这样:
const Sequelize = require('../node_modules/sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'sqlite',
logging: false,
storage: 'database.sqlite',
});
// importing the modules
// import() is deprecated and will throw an error!
sequelize.import('models/model1');
sequelize.import('models/model2');
sequelize.import('models/model3');
// if force == true this will create the table, dropping it first if it already existed.
const force = process.argv.includes('--force') || process.argv.includes('-f');
// sync the database
sequelize.sync({ force }).then(async() => {
console.log('dbInit.js: Database synced');
sequelize.close();
}).catch(console.error);
当我运行此文件时,我观察到以下错误:TypeError: sequelize.import is not a function
。这个错误很明显,导入不是函数!这让我在Sequelize文档中发现了这个页面,其中说明了以下内容:
已弃用:sequelize.import
注意:您不应该使用sequelize.import。请使用require。
考虑到这一点,以下是我的主要问题:
1:在初始化期间,我如何告诉Sequelize哪些模型要包含在我的数据库中文档非常清楚,我应该"只使用require"。但该文件并没有提供新公约的明确例子。
2:如何正确使用require来包含模型
我很难找到一个例子来说明它是如何工作的。我是JS的新手,所以这可能非常明显,因此缺少示例。我想我们可以做一些类似const model1 = require(path/to/model1);
的事情,然后我可以把它插入同步函数吗?
Kinda现在正在处理同样的问题,刚刚解决了它。我在代码中使用babel进行导入,但如果不需要,您可以根据需要更改它们。
您可以导入外部模块以进行如下排序:在您的dbInit.js中尝试:
// dbInit.js
import Sequelize from 'sequelize';
import model1 from './model1'
import model2 from './model2'
const sequelize = new Sequelize(
process.env.DATABASE,
process.env.DATABASE_USER,
process.env.DATABASE_PASSWORD,
{
dialect: 'sqlite',
},
);
model1(sequelize, Sequelize.DataTypes);
model2(sequelize, Sequelize.DataTypes);
const models = sequelize.models;
export { sequelize };
export default models;
型号1可能看起来像这样:
// model1.js
const message = (sequelize, DataTypes) => {
const Message = sequelize.define('message', {
text: DataTypes.STRING,
});
Message.associate = (models) => {
Message.belongsTo(models.User);
};
return Message;
};
export default message;
然后你可能想在你的主index.js或其他东西中导入你的dbInit.js:
// index.js
import models, {sequelize} from './dbInit';
sequelize.sync({ force }).then(async () => {
app.listen(process.env.PORT, () =>
console.log(models)
);
});
在这里,您可以像这样导入模型。
const models = require('./models'); //path of models folder
const ModelA = models.model1;
const ModelB = models.model2;
const ModelC = models.model3;
//Sequelize v5
现在您不必导入Sequelize
,因为models
文件夹具有index.js
这将为您建立连接。
用于使用sequelize方法。只需像这样添加型号即可。
models.sequelize.sync({ force }).then(async() => {
console.log('dbInit.js: Database synced');
sequelize.close();
}).catch(console.error);
我找到了解决问题的方法。这不是我理想的解决方案,因为我真的希望能够定义外部模型,然后根据需要引入它们。如果有人能找到/向我展示一个关于如何工作的坚实例子
最后,我使用sequelize.define()
方法在dbInit.js
中内联定义了我的模型。这基本上就是他们在Sequelize官方例子中的做法。在sqlite的数据库浏览器中检查这一点表明dbInit.js
确实创建了所需的表。
// define a model...
sequelize.define('modelName',{
random_thing:{
type: Sequelize.STRING,
primaryKey: true,
}
}, {
timestamps: false,
});
// then sync the db...
我将继续这个项目,寻找更好的解决方案。
您可以简单地导入sequelize.js文件中的函数,如
const dbConfig = require("../config/db.config")[process.env.NODE_ENV];
const Sequelize = require("sequelize");
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
host: dbConfig.HOST,
dialect: dbConfig.DIALECT,
operatorsAliases: false,
});
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
db.model1= require("./model1")(sequelize, Sequelize);
db.model2 = require("./model2")(sequelize, Sequelize);
db.model3= require("./model3")(sequelize, Sequelize);
db.sequelize.sync({ force: true }).then(() => {
console.log("Drop and re-sync db.");
});
module.exports = db;
我在这里导入了所有的模型,并制作了一个可以轻松使用的常量数据库。