我是TypeScript的新手,我正在尝试使用Sequelize和Sequelize Auto生成数据库模型,然后使用它们进行查询。
到目前为止,已经生成了模型,但是当我尝试实际使用它们时,会出现错误。
/* jshint indent: 2 */
// tslint:disable
import * as sequelize from 'sequelize';
import {DataTypes} from 'sequelize';
import {settings_user_tblInstance, settings_user_tblAttribute} from './db';
module.exports = function(sequelize: sequelize.Sequelize, DataTypes: DataTypes) {
return sequelize.define<settings_user_tblInstance, settings_user_tblAttribute>('settings_user_tbl', {
id: {
type: DataTypes.BIGINT,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
user_id: {
type: DataTypes.BIGINT,
allowNull: true,
references: {
model: 'user_tbl',
key: 'id'
},
unique: true
},
notification_email_enabled: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
}
}, {
tableName: 'settings_user_tbl'
});
};
但是尝试使用此模型时,出现以下错误:
return sequelize.define<settings_user_tblInstance, settings_user_tblAttribute>('settings_user_tbl', {
src/models/tag_group_tbl.ts:7:70 - error TS2709: Cannot use namespace 'DataTypes' as a type.
module.exports = function(sequelize: sequelize.Sequelize, DataTypes: DataTypes) {
我对这两个错误都感到很迷惑-好像DataTypes定义正确?这就是Sequelize Auto生成文件的方式-是否这样做不正确?
为什么它只期望0个参数而不是2个?
这可能是版本不兼容的事情吗?
很抱歉,这个毫无头绪的问题-从字面上看,我刚开始使用TypeScript,但我不确定这到底是怎么回事。
我认为这不是在续集中使用Typescript的正确方法。通常,我们定义要定义的模型的接口。
实际上,文档中有一个打字稿实现的示例。 https://sequelize.org/master/manual/typescript.html
老实说,目前sequelize-auto
的TS支持确实不好,生成器将创建错误的类型。
[最新版本也已经发布two years ago,人们也分叉并发布了their own packages,所以我不确定是否正在积极地进行开发。您仍然可以让sequelize-auto
创建样板列定义,类属性等,然后手动将它们复制到模型中。
首先,使用sequelize-auto
选项运行-z
以创建类型定义。示例:
-z
给定数据库中的npx sequelize-auto -h localhost -u dontcare -d my-db.db --dialect sqlite -z
表,user
生成文件sequelize-auto
和user.ts
下的其他文件,其中包含您已经遇到的大量TS编译错误。例如,models
是一个命名空间,但在函数参数中用作类型,泛型在DataTypes
函数上设置,根本不需要泛型。
也sequelize.define
使用sequelize-auto
创建模型定义。我宁愿坚持使用类语法,如sequelize sequelize.define
的第一部分所示-它产生更易读且易于声明的类型。
因此,总而言之,坚持使用sequelize.define
,复制我们所需的代码并随后再次删除生成的文件更有意义。有用的代码是生成的表列定义和类属性:
在TypeScript docs section中,复制所有表列属性,例如above tutorial等。在user.ts
下,应该有类似id: { type: DataTypes.INTEGER, allowNull: true, primaryKey: true }
的界面,可以从中使用类属性。最后,在某处通过类语法创建模型:
db.d.ts
和userAttribute
模型。在这里,您还可以将生成的代码粘贴到:
import { Sequelize, Model } from 'sequelize';
// your models
class User extends Model {
// paste class attributes here
// also add `null assertion` `!`, which is required in strict mode (see their docs)
}
...
希望,会有所帮助。
[某人具有与initialize回购完全相同的User.init({ /*pass column definitions*/ }
,并最终成为issue回购,他最近似乎很活跃:值得尝试一下他的版本,看看是否能解决问题,他实际上已在原始存储库中关闭了该问题😃
但是我建议您尝试切换到sequelize-auto
和forking,因为从第一天开始它就是面向Typescript的。