![](/img/trans.png)
[英]SequelizeDatabaseError: relation "users" does not exist in Koa.js framework
[英]Unhandled rejection SequelizeDatabaseError: relation "users" does not exist
我正在開始使用 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”,任何解釋。)
但是,當我添加以下代碼部分時:
User.findAll().then(users => {
console.log(users)
})
我收到此錯誤:
未處理的拒絕 SequelizeDatabaseError:關系“用戶”不存在
所以我的問題是:
當您定義模型時,您可以添加配置,在這種情況下,您必須添加的選項是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,
});
還有另一種有趣的方法可以避免這種情況。 但是您需要真正關注這種實現方式。
const User = sequelize.define("user", {
firstname: {
type: Sequelize.STRING
},
lastname: {
type: Sequelize.STRING
}
});
您故意將user
放在這里並在其他編碼位置使用users
(假設 sequelize 會自動將所有傳遞的模型名稱(定義的第一個參數)轉換為復數)。 這種編碼方式將簡化您的代碼。
運行該代碼兩次。
在第二次運行之前,注釋掉以下代碼,
// 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 會根據遷移文件名及其字母順序進行遷移。 我的問題是我的文件命名沒有排序以創建正確的連接。 如果您遇到此問題,請確保您的遷移文件以正確的(按字母順序)順序觸發。
正確的順序是首先遷移沒有連接的表(例如 table_A),然后是連接到 table_A 的表。
正如我所說,這可能不是您特定訂單的答案,但我想分享我的經驗,因為我在尋找此錯誤時沒有在互聯網上找到此信息。
就我而言,問題是沒有創建表users
。 您可以使用CREATE TABLE IF NOT EXISTS
(SQL) 手動CREATE TABLE IF NOT EXISTS
或在選項對象中添加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"
}
);
出現此問題是因為創建表是一個異步函數。 問題是,可以在尚未創建表的情況下執行 findAll() 函數。 要解決此問題,您可以使用:
(async ()=>{
await User.sync({force: true});
// Table created
await User.create({
firstName: 'John',
lastName: 'Hancock'
});
const users=await User.findAll();
console.log(users);
})();
只需將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',
}
);
如果您希望 Sequelize 為模型使用單數詞 ('info') 並為表使用相同的單數詞 ('info'),您可以將模型命名為 'info' 並在定義中添加tablename: 'info'
你的模型。
這是一種在逐表的基礎上控制 Sequelize 是否將模型名稱復數化的默認行為的方法。
info.js
module.exports = (sequelize, DataTypes) => {
const info = sequelize.define('info', {
firstname: DataTypes.STRING,
email: DataTypes.STRING,
phone: DataTypes.STRING,
}, {
tableName: 'info'
});
return info;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.