我开始使用Sequelize。我正在关注他们在其网站上提供的文档:http://docs.sequelizejs.com/manual/installation/getting-started.html
const Sequelize = require('sequelize');
const sequelize = new Sequelize('haha', 'postgres', 'postgres', {
host: 'localhost',
dialect: 'postgres',
operatorsAliases: false,
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
// SQLite only
storage: 'path/to/database.sqlite'
});
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
const User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
});
// force: true will drop the table if it already exists
User.sync({force: true}).then(() => {
// Table created
return User.create({
firstName: 'John',
lastName: 'Hancock'
});
});
直到这里,一切都运行良好。并正确构建并填充了“用户”表。 (尽管我不理解Sequelize会在“用户”后自动添加“ s”,但有任何解释。)
但是,当我添加以下代码部分时:
User.findAll().then(users => {
console.log(users)
})
我收到此错误:
未处理的拒绝SequelizeDatabaseError:关系“用户”不存在 存在
所以我的问题是:
答案 0 :(得分:2)
还有另一种有趣的方式可以避免这种情况。但是您需要真正专注于这种实现方式。
const User = sequelize.define("user", {
firstname: {
type: Sequelize.STRING
},
lastname: {
type: Sequelize.STRING
}
});
您有意将user
放在此处,并在其他编码位置使用users
(假设sequelize会自动将所有传递的模型名称(define的第一个参数)转换为复数形式)。这种编码方式将简化您的代码。
答案 1 :(得分:1)
定义模型时,可以添加配置,在这种情况下,必须添加的选项为freezeTableName
,以防止名称重复。
const User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
}, {
// disable the modification of table names; By default, sequelize will automatically
// transform all passed model names (first parameter of define) into plural.
// if you don't want that, set the following
freezeTableName: true,
});
答案 2 :(得分:1)
也许答案与您的问题并不完全相关,但我想描述一下我遇到此错误的经验
错误:关系“用户”不存在。
似乎Sequelize根据迁移文件名及其字母顺序进行迁移。我的问题是我的文件命名未排序以创建正确的连接。 如果您遇到此问题,请确保以正确的顺序(按字母顺序)触发您的迁移文件。
正确的顺序是先迁移没有连接的表(例如table_A),然后迁移有连接到table_A的表。
正如我说的那样,这可能无法满足您的特定订单,但我想分享自己的经验,因为我在查找此错误时没有在互联网上找到此信息。
答案 3 :(得分:0)
出现这个问题是因为创建表是一个异步函数。问题是,可以在尚未创建表的情况下执行 findAll() 函数。 要解决此问题,您可以使用:
(async ()=>{
await User.sync({force: true});
// Table created
await User.create({
firstName: 'John',
lastName: 'Hancock'
});
const users=await User.findAll();
console.log(users);
})();
答案 4 :(得分:0)
只需将 tableName: "Users"
附加到您的模型配置。
我发现解决的最简单方法是在模型上显式设置 tableName
。正如其他人所提到的,sequelize 默认使用模型的复数形式作为表名。例如用户,成为用户。
当您查询时,sequelize 会处理与您的模型 User
同名的表。通过在模型中定义 tableName
,sequelize 应该搜索正确的表。将 tableName: "Users"
附加到您的模型配置中,即:
User.init(
{
email: DataTypes.STRING,
password: DataTypes.STRING,
role: DataTypes.INTEGER,
},
{
sequelize,
modelName: 'User',
tableName: 'Users',
}
);
答案 5 :(得分:0)
就我而言,问题在于表 users
未创建。您可以使用 CREATE TABLE IF NOT EXISTS
(SQL) 手动创建表或在选项对象中添加 tableName = "users"
:
export const User = db.define('user',
{
id: {
type: DataTypes.UUIDV4,
autoIncrement: true,
primaryKey: true,
},
name: {
type: new DataTypes.STRING(128),
allowNull: false,
},
email: {
type: new DataTypes.STRING(128),
allowNull: true,
},
password: {
type: new DataTypes.STRING(128),
allowNull: true,
},
},
{
freezeTableName: true,
tableName: "users"
}
);