如何打印出续集实例的表名?

rob*_*rob 10 database orm node.js sequelize.js

我想打印出我用sequelize查询的实例的表名:

models.User.findById(id).then(user => {
    console.log('instance type is, ', user.getTableName || user.getType)) // => instance type is, users
}
Run Code Online (Sandbox Code Playgroud)

有没有办法打印出实例的表名?有没有办法打印出实例的型号名称?我搜索了文档,但找不到上面的API.

mvi*_*okx 29

piotrbienias的答案是v3,你在v4中做到:

user.constructor.getTableName()或者user.constructor.tableName用于表名和user.constructor.name模型名

ref:V4中的突破性变化

我花了一段时间来弄明白这一点,虽然我不会在这里发布,以防其他人来寻找这个答案.


pio*_*ias 15

表名:user.Model.getTableName()user.Model.tableName

型号名称: user.Model.name


Moh*_*lal 12

注意:简短的答案在第一部分!您可以浏览更多内容以查看更多详细信息!还有有趣的元素!以及我所做的测试!全部清除!您可以浏览并查看大标题!

\n

从 v4 到 v6

\n

它在它们身上都一样有效

\n

使用模型类

\n

如果我们以模型为例User

\n
User.name // => Model name => `User` (you don\'t need that!\n         //     unless you are doing something dynamic!)\n\nUser.tableName // => Users\nUser.getTableName()\n             // => Users (no schema)\n            // or `"AmASchema"."Users"` (pg), `AmASchema.Users` (MySql)  (schema)\n           // or { tableName: \'Users\', schema: \'AmASchema\', ... } (schema)\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以在类型定义中看到

\n

在此输入图像描述

\n

在此输入图像描述

\n
  public static getTableName(): string | {\n    tableName: string;\n    schema: string;\n    delimiter: string;\n  };\n
Run Code Online (Sandbox Code Playgroud)\n

使用模型实例

\n
const user = User.build(...)\n\nuser.constructor.name // => User\nuser.constructor.tableName // => Users\n\nuser.constructor.getTableName()\n             // => Users (no schema)\n            // or `"AmASchema"."Users"` (pg), `AmASchema.Users` (MySql)  (schema)\n           // or { tableName: \'Users\', schema: \'AmASchema\', ... } (schema)\n
Run Code Online (Sandbox Code Playgroud)\n

什么\xc2\xa0不起作用

\n
instance.name // => undefined\ninstance.tableName // => undefined\n\n// tested in v4.0, v4.28.10 and v6\n
Run Code Online (Sandbox Code Playgroud)\n

我的假设和考虑是错误的!在某些版本中可能会出现这种情况!instance.name作品!而且不是 constructor 版本!但不是!到目前为止我的测试表明事实并非如此!以上所有功能适用于从V4到V6的所有版本!而这一切都没有,都没有!

\n

还要知道我签入了V6,打字稿定义没有公开任何modeInstance.name属性modelInstance.tableName

\n

您可以在续集model.d.ts类型文件Line:1527中检查这一点(链接将直接转到该行!您可以CTRL+F并搜索tableName(在 Model 类中,您只会找到:L1553L1658L1679 14 个查找,8 个在 Model 类中) ,仅在注释中有所不同!)![静态属性用 表示Static!不要将它们混淆!与实例属性])

\n
instance.Model.name // Error (instance.Model => undefined)\ninstance.Model.tableName // Error (instance.Model = undefined)\n\n// tested in both v4.0, v4.28.10 and v6\n
Run Code Online (Sandbox Code Playgroud)\n

也不行啊!

\n

在此输入图像描述

\n

在此输入图像描述

\n

我测试了什么

\n

全部经过测试:

\n
    \n
  • v4.0.0
  • \n
  • v4.28.10
  • \n
  • v6!
  • \n
\n

举个例子吧!instance.constructor.tableName就是有效的!

\n

并且它在所有这些中的作用都是相同的!

\n

User 类扩展了 Model 与sequ​​elize.define()

\n

在 V6 中:我尝试对抗 bohtclass User extends Modelsequelize.define()! 两者工作原理相同!

\n

打字稿和转译

\n

我针对不同的目标进行了测试:

\n
    \n
  • ES5(仅sequelize.define()!ES5转译不支持完整的ES6类(检查此处Stackoverflow答案末尾的原因部分以了解原因))
  • \n
  • ES6
  • \n
  • ES2021
  • \n
\n

=> 一切都一样!而且以上内容对所有人都有效!

\n

我的结果日志

\n

V6(目标 ES2021、ES6、ES5)

\n
--------------- Testing Models Classes -----------------------\n\n\nStatic access using getTableName() (without Schema) :\n\nCourse.getTableName(): Courses\n\n\nStatic access using getTableName() (with Schema) :\n\nUser.getTableName(): "AmASchema"."Users"\n\nAnd ::::\n\nCourse.name: Course\nCourse.tableName: Courses\nUser.name: User\nUser.tableName: Users\n\n----\n\n---------------------- Testing Models instances ----------------\n\nTesting using  Class Extends Model definition :::: \n\nInstance access using instance.name and instance.tableName\ncourse.name: undefined\ncourse.tableName: undefined\n\nInstance access using instance.constructor.name and instance.constructor.tableName and getTableName()\n\ncourse.constructor.name: Course\ncourse.constructor.tableName: Courses\ncourse.constructor.getTableName(): Courses\n\nTesting using  sequelize.define() definition :::: \n\nInstance access using instance.name and instance.tableName\nuser.name: undefined\nuser.tableName: undefined\n\nInstance access using instance.constructor.name and instance.constructor.tableName and getTableName()\n\nuser.constructor.name: User\nuser.constructor.tableName: Users\nuser.constructor.getTableName(): "AmASchema"."Users"\n
Run Code Online (Sandbox Code Playgroud)\n

V4(同上)

\n
---------------------- Testing Models Classes ----------------\n\nStatic access using getTableName() (without Schema) :\n\nCourse.getTableName(): Courses\n\n\nStatic access using getTableName() (with Schema) :\n\nUser.getTableName(): "AmASchema"."Users"\n\nAnd ::::\n\nCourse.name: Course\nCourse.tableName: Courses\nUser.name: User\nUser.tableName: Users\n\n----\n\n--------------- Testing Models instances -----------------------\n\nTesting using  sequelize.define() definition :::: \n\nInstance access using instance.name and instance.tableName\n\nuser.name: undefined\nuser.tableName: undefined\n\nInstance access using instance.constructor.name and instance.constructor.tableName and getTableName()\n\nuser.constructor.name: User\nuser.constructor.tableName: Users\nuser.constructor.getTableName(): "AmASchema"."Users"\n
Run Code Online (Sandbox Code Playgroud)\n

回购以自行检查和测试

\n

我公开分享了测试仓库!如果你想快速测试!在你的机器上!您可以检查下面的测试仓库:

\n

https://github.com/MohamedLamineAllal/sequelize-name-and-tableName-test

\n

有两个分支:

\n
    \n
  • 续集/v4
  • \n
  • 续集/v6
  • \n
\n

大师已经是最新版本了!(现在是 v6)

\n

有关使用模型类 getTableName() 的详细信息

\n

https://sequelize.org/master/class/lib/model.js~Model.html#static-method-getTableName

\n
\n

公共静态 getTableName(): string | 目的

\n
\n
\n

获取模型的表名称,同时考虑架构。如果模型没有架构,则该方法将以字符串形式返回名称,或者返回具有 tableName、架构和分隔符属性的对象。

\n
\n

没有模式 => 返回 tableName 字符串

\n

有 schema => return { tableName, schema, delimter } 对象。

\n

根据这一点,我们可以通过以下方式之一访问:

\n
User.name // => Model name => `User` (you don\'t need that!\n         //     unless you are doing something dynamic!)\n\nUser.tableName // => Users\nUser.getTableName()\n             // => Users (no schema)\n            // or `"AmASchema"."Users"` (pg), `AmASchema.Users` (MySql)  (schema)\n           // or { tableName: \'Users\', schema: \'AmASchema\', ... } (schema)\n
Run Code Online (Sandbox Code Playgroud)\n

这是直接从模型类静态获取的。

\n

医生是这么说的!我的测试即使有模式也返回了一个字符串!

\n

我们也可以在代码源类型文件L1658中看到提及!

\n

在此输入图像描述

\n

注意:我尝试设置一个架构!但结果是一个字符串!

\n
`"AmASchema"."Users"`\n
Run Code Online (Sandbox Code Playgroud)\n

您可以在上面的共享日志中查看!

\n

如果有人知道什么类型的模式可能会触发对象返回格式!让我知道,以便我将其添加到答案中!

\n

注意 的定义getTablename()

\n

lib/model.js#L1440

\n

在此输入图像描述

\n

lib/dialects/abstract/query-generator.js#L50

\n

在此输入图像描述

\n

getTableName() 与 tableName

\n
Model.getTableName() // No schema: return =>  `Users`\n                   // Schema:\n                  // return => `"MySchema"."Users"` (Postgres),\n                 // `MySchema.Users` (Mysql)\n               // Or { tableName: \'Users\', schema: \'MySchema\', ... }\n\ninstance.constructor.getTableName() // same as above\n
Run Code Online (Sandbox Code Playgroud)\n

=> 如果有与表名一起返回模式!

\n

尽管

\n
Model.tableName // return => `Users`\n// or\nuser.constructor.tableName // return => `Users`\n
Run Code Online (Sandbox Code Playgroud)\n

=> 将仅返回表名

\n

额外:关于自动表命名的注意事项

\n
\n

默认情况下,当未给出表名称时,Sequelize 会自动将模型名称复数并将其用作表名称。这种复数化是由一个名为inflection 的库在幕后完成的,因此Person -> People可以正确计算不规则复数(例如 )。
\n当然,这种行为很容易配置。

\n
\n
User -> Users\nClass -> Classes\nPerson -> People\nChild -> Children\nCourse -> Courses\n
Run Code Online (Sandbox Code Playgroud)\n

https://sequelize.org/master/manual/model-basics.html

\n

您还可以强制使用与模块相同的名称(参考)!

\n