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.
Moh*_*lal 12
注意:简短的答案在第一部分!您可以浏览更多内容以查看更多详细信息!还有有趣的元素!以及我所做的测试!全部清除!您可以浏览并查看大标题!
\n它在它们身上都一样有效
\n如果我们以模型为例User!
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)\nRun Code Online (Sandbox Code Playgroud)\n我们可以在类型定义中看到
\n\n\n public static getTableName(): string | {\n tableName: string;\n schema: string;\n delimiter: string;\n };\nRun Code Online (Sandbox Code Playgroud)\nconst 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)\nRun Code Online (Sandbox Code Playgroud)\ninstance.name // => undefined\ninstance.tableName // => undefined\n\n// tested in v4.0, v4.28.10 and v6\nRun Code Online (Sandbox Code Playgroud)\n我的假设和考虑是错误的!在某些版本中可能会出现这种情况!instance.name作品!而且不是 constructor 版本!但不是!到目前为止我的测试表明事实并非如此!以上所有功能适用于从V4到V6的所有版本!而这一切都没有,都没有!
还要知道我签入了V6,打字稿定义没有公开任何modeInstance.name属性modelInstance.tableName!
您可以在续集model.d.ts类型文件Line:1527中检查这一点(链接将直接转到该行!您可以CTRL+F并搜索tableName(在 Model 类中,您只会找到:L1553、L1658、L1679 14 个查找,8 个在 Model 类中) ,仅在注释中有所不同!)![静态属性用 表示Static!不要将它们混淆!与实例属性])
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\nRun Code Online (Sandbox Code Playgroud)\n也不行啊!
\n\n\n全部经过测试:
\n举个例子吧!instance.constructor.tableName就是有效的!
并且它在所有这些中的作用都是相同的!
\n在 V6 中:我尝试对抗 bohtclass User extends Model和sequelize.define()! 两者工作原理相同!
我针对不同的目标进行了测试:
\n=> 一切都一样!而且以上内容对所有人都有效!
\nV6(目标 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"\nRun Code Online (Sandbox Code Playgroud)\nV4(同上)
\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"\nRun Code Online (Sandbox Code Playgroud)\n我公开分享了测试仓库!如果你想快速测试!在你的机器上!您可以检查下面的测试仓库:
\nhttps://github.com/MohamedLamineAllal/sequelize-name-and-tableName-test
\n有两个分支:
\n大师已经是最新版本了!(现在是 v6)
\nhttps://sequelize.org/master/class/lib/model.js~Model.html#static-method-getTableName
\n\n\n公共静态 getTableName(): string | 目的
\n
\n\n获取模型的表名称,同时考虑架构。如果模型没有架构,则该方法将以字符串形式返回名称,或者返回具有 tableName、架构和分隔符属性的对象。
\n
没有模式 => 返回 tableName 字符串
\n有 schema => return { tableName, schema, delimter } 对象。
\n根据这一点,我们可以通过以下方式之一访问:
\nUser.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)\nRun Code Online (Sandbox Code Playgroud)\n这是直接从模型类静态获取的。
\n医生是这么说的!但我的测试即使有模式也返回了一个字符串!
\n我们也可以在代码源类型文件L1658中看到提及!
\n\n注意:我尝试设置一个架构!但结果是一个字符串!
\n`"AmASchema"."Users"`\nRun Code Online (Sandbox Code Playgroud)\n您可以在上面的共享日志中查看!
\n如果有人知道什么类型的模式可能会触发对象返回格式!让我知道,以便我将其添加到答案中!
\n注意 的定义getTablename():
lib/dialects/abstract/query-generator.js#L50
\n\nModel.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\nRun Code Online (Sandbox Code Playgroud)\n=> 如果有与表名一起返回模式!
\n尽管
\nModel.tableName // return => `Users`\n// or\nuser.constructor.tableName // return => `Users`\nRun Code Online (Sandbox Code Playgroud)\n=> 将仅返回表名
\n\n\n默认情况下,当未给出表名称时,Sequelize 会自动将模型名称复数并将其用作表名称。这种复数化是由一个名为inflection 的库在幕后完成的,因此
\nPerson -> People可以正确计算不规则复数(例如 )。
\n当然,这种行为很容易配置。
User -> Users\nClass -> Classes\nPerson -> People\nChild -> Children\nCourse -> Courses\nRun Code Online (Sandbox Code Playgroud)\nhttps://sequelize.org/master/manual/model-basics.html
\n您还可以强制使用与模块相同的名称(参考)!
\n| 归档时间: |
|
| 查看次数: |
5556 次 |
| 最近记录: |