sequelize或mysql创建额外的表,eer图中缺少表连接

neskvpey  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(354)

更新01/02
请看截图。我把app缩减为两个表:地址和用户。
运行下面的sequelize db:migrate with migrations/models会创建一个额外的“users”表。请参见目录部分。单击“users”会弹出消息“您试图编辑的表是一个仅用于模型的存根,创建此存根是为了表示外键引用的缺少的外部表。”
图表没有额外的“users”表。没有为addresses.userid绘制到users.id的连接。
有人想知道为什么或者如何修复吗?
在macbook os x 10.14.2上运行
sequelize版本:sequelize cli[节点:10.7.0,cli:5.4.0,orm:4.42.0]
mysql服务器版本:8.0.13
mysql工作台版本也是:8.0.13

更新12/30
在mysql工作台中,database>reverse engineer呈现一个表图,但不绘制外键/主键线。数据库引擎是innodb。
我使用sequelize迁移/模型来创建数据库和关系。例如,addresses表具有users表的“userid”外键。
在eer图的目录部分的表中,不知何故有一个“users”表和“users”表。外键addresses.userid指向小写的“users”表,该表不应存在。小写的表不会出现在图表中,也不会出现在schema部分的db table列表中,它只出现在表的catalog部分。
还有另外两对表:property/property、propertyclass/propertyclass。没有其他表有重复项。users和propertyclasses有一个联接表userpropertyclasses。
你知道为什么会发生这种情况,或者如何预防吗?
sequelize版本:sequelize cli[节点:10.7.0,cli:5.4.0,orm:4.42.0]
mysql服务器版本:8.0.13
mysql工作台版本也是:8.0.13
以下是地址模型:

  1. 'use strict';
  2. module.exports = (sequelize, DataTypes) => {
  3. const Address = sequelize.define('Address', {
  4. userId: {
  5. type: DataTypes.INTEGER,
  6. validate: {
  7. notNull: true
  8. }
  9. },
  10. street1: {
  11. type: DataTypes.STRING,
  12. validate: {
  13. notEmpty: true
  14. }
  15. }
  16. }, {
  17. paranoid: true
  18. });
  19. Address.associate = function(models) {
  20. Address.belongsTo(models.User, {
  21. as: 'user',
  22. foreignKey: 'userId'
  23. })
  24. }
  25. return Address;
  26. };

以下是地址迁移:

  1. 'use strict';
  2. module.exports = {
  3. up: (queryInterface, Sequelize) => {
  4. return queryInterface.createTable('Addresses', {
  5. id: {
  6. allowNull: false,
  7. autoIncrement: true,
  8. primaryKey: true,
  9. type: Sequelize.INTEGER
  10. },
  11. userId: {
  12. allowNull: false,
  13. type: Sequelize.INTEGER,
  14. references: {
  15. model: 'Users',
  16. key: 'id'
  17. }
  18. },
  19. street1: {
  20. allowNull: false,
  21. type: Sequelize.STRING(50)
  22. },
  23. createdAt: {
  24. allowNull: false,
  25. type: Sequelize.DATE
  26. },
  27. updatedAt: {
  28. allowNull: false,
  29. type: Sequelize.DATE
  30. },
  31. deletedAt: {
  32. allowNull: true,
  33. defaultValue: null,
  34. type: Sequelize.DATE
  35. }
  36. })
  37. .then(async () => {
  38. return await Promise.all([
  39. queryInterface.addIndex('Addresses', [ 'userId' ]),
  40. ])
  41. });
  42. }

用户模型:

  1. 'use strict';
  2. module.exports = (sequelize, DataTypes) => {
  3. const User = sequelize.define('User', {
  4. firstname: {
  5. type: DataTypes.STRING,
  6. validate: {
  7. notEmpty: true
  8. }
  9. }
  10. }, {
  11. paranoid: true
  12. });
  13. User.associate = function(models) {
  14. User.hasOne(models.Address, {
  15. as: 'address',
  16. foreignKey: 'userId'
  17. })
  18. };
  19. return User;
  20. };

以下是用户迁移:

  1. 'use strict';
  2. module.exports = {
  3. up: (queryInterface, Sequelize) => {
  4. return queryInterface.createTable('Users', {
  5. id: {
  6. allowNull: false,
  7. autoIncrement: true,
  8. primaryKey: true,
  9. type: Sequelize.INTEGER
  10. },
  11. firstname: {
  12. allowNull: false,
  13. type: Sequelize.STRING(50)
  14. },
  15. createdAt: {
  16. allowNull: false,
  17. type: Sequelize.DATE
  18. },
  19. updatedAt: {
  20. allowNull: false,
  21. type: Sequelize.DATE
  22. },
  23. deletedAt: {
  24. allowNull: true,
  25. defaultValue: null,
  26. type: Sequelize.DATE
  27. }
  28. })
  29. .then(async () => {
  30. return await Promise.all([
  31. queryInterface.addIndex('Users', [ 'firstname' ]),
  32. ]);
  33. })
  34. }
qqrboqgw

qqrboqgw1#

在这里张贴我的发现,如果它有助于其他人。
mysql docs声明在使用innodb时表名应该是小写的。
如果您使用的是innodb表,那么应该在所有平台上将此变量设置为1,以强制将名称转换为小写。
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lower_case_table_names
以下是为消除额外的表创建和使用关系连接呈现图表所做的更改:
表名大小写复数形式
表列名及其引用
型号和名称pascalcase singular
“field”snake case单数形式的模型属性名称
使用“tablename”选项创建的模型大小写复数
使用选项“下划线”创建的模型为真
“as”别名和“foreignkey”snake case的模型关联
迁移示例:

  1. 'use strict';
  2. module.exports = {
  3. up: (queryInterface, Sequelize) => {
  4. return queryInterface.createTable('addresses', {
  5. id: {
  6. allowNull: false,
  7. autoIncrement: true,
  8. primaryKey: true,
  9. type: Sequelize.INTEGER
  10. },
  11. user_id: {
  12. allowNull: false,
  13. type: Sequelize.INTEGER,
  14. references: {
  15. model: 'users',
  16. key: 'id'
  17. }
  18. },
  19. street1: {
  20. allowNull: false,
  21. type: Sequelize.STRING(50)
  22. }
  23. created_at: {
  24. allowNull: false,
  25. type: Sequelize.DATE
  26. },
  27. updated_at: {
  28. allowNull: false,
  29. type: Sequelize.DATE
  30. },
  31. deleted_at: {
  32. allowNull: true,
  33. defaultValue: null,
  34. type: Sequelize.DATE
  35. }
  36. })
  37. },
  38. down: (queryInterface, Sequelize) => {
  39. return queryInterface.dropTable('addresses');
  40. }
  41. };

模型示例:

  1. 'use strict';
  2. module.exports = (sequelize, DataTypes) => {
  3. const Address = sequelize.define('Address', {
  4. userId: {
  5. type: DataTypes.INTEGER,
  6. field: 'user_id',
  7. allowNull: false,
  8. validate: {
  9. notNull(value) {
  10. if (value == null) {
  11. throw new Error('Missing user id')
  12. }
  13. }
  14. }
  15. },
  16. street1: {
  17. type: DataTypes.STRING,
  18. field: 'street1',
  19. validate: {
  20. notEmpty: true
  21. }
  22. }
  23. }, {
  24. tableName: 'addresses',
  25. paranoid: true,
  26. underscored: true
  27. });
  28. Address.associate = function(models) {
  29. Address.belongsTo(models.User, {
  30. as: 'user',
  31. foreignKey: 'user_id'
  32. })
  33. }
  34. return Address;
  35. };
展开查看全部

相关问题