Javascript 续集选项未按预期运行

Javascript 续集选项未按预期运行,javascript,node.js,postgresql,sequelize.js,Javascript,Node.js,Postgresql,Sequelize.js,我一直在YouTube上关注Ben Awad的教程。具体地说,我正在使用sequelize建立一个PostgreSQL数据库,正如他概述的那样 我想在camel-case中定义我的字段,并将它们转换为snake-case,就像他在教程中所做的那样,特别是在sequelize中概述的那样。但是,当我执行相同操作时,我的表字段不会转换为snake-case 以下是我正在使用的代码: models/index.js import Sequelize from 'sequelize'; var seq

我一直在YouTube上关注Ben Awad的教程。具体地说,我正在使用
sequelize
建立一个PostgreSQL数据库,正如他概述的那样

我想在camel-case中定义我的字段,并将它们转换为snake-case,就像他在教程中所做的那样,特别是在
sequelize
中概述的那样。但是,当我执行相同操作时,我的表字段不会转换为snake-case

以下是我正在使用的代码:

models/index.js

import Sequelize from 'sequelize';

var sequelize = new Sequelize('dms', 'postgres', 'postgres', {
    dialect: 'postgres', 
    define: {
        underscored: true,
        freezeTableName: true,
    },
});

const models = {
    Appointments: sequelize.import('./appointment'),
};

Object.keys(models).forEach(modelName => {
    if (models[modelName].associate) {
        models[modelName].associate(models);
    }
});

models.sequelize = sequelize;
models.Sequelize = Sequelize;

export default models;
export default (sequelize, DataTypes) => {
    const Appointment = sequelize.define("appointment",
        {
            status: {
                type: DataTypes.STRING
            },
            appointmentStart: {
                type: DataTypes.DATE,
            },
            appointmentEnd: {
                type: DataTypes.DATE,
            },
        },
    );

    return Appointment;
};
import { ApolloServer, gql} from 'apollo-server';
import typeDefs from './schema';
import resolvers from './resolvers';
import models from './models';

const PORT = 8080;

const graphqlEndpoint = '/graphql';

const server = new ApolloServer({
    typeDefs,
    resolvers,
    graphqlPath: graphqlEndpoint
});

models.sequelize.sync({force:true}).then(() =>  {
    server.listen(PORT)
});
从上面的文件中,我的理解是,
define:{下划线:true}
应该将所有表字段转换为snake-case,正如他在上面的教程视频中所述

models/appointment.js

import Sequelize from 'sequelize';

var sequelize = new Sequelize('dms', 'postgres', 'postgres', {
    dialect: 'postgres', 
    define: {
        underscored: true,
        freezeTableName: true,
    },
});

const models = {
    Appointments: sequelize.import('./appointment'),
};

Object.keys(models).forEach(modelName => {
    if (models[modelName].associate) {
        models[modelName].associate(models);
    }
});

models.sequelize = sequelize;
models.Sequelize = Sequelize;

export default models;
export default (sequelize, DataTypes) => {
    const Appointment = sequelize.define("appointment",
        {
            status: {
                type: DataTypes.STRING
            },
            appointmentStart: {
                type: DataTypes.DATE,
            },
            appointmentEnd: {
                type: DataTypes.DATE,
            },
        },
    );

    return Appointment;
};
import { ApolloServer, gql} from 'apollo-server';
import typeDefs from './schema';
import resolvers from './resolvers';
import models from './models';

const PORT = 8080;

const graphqlEndpoint = '/graphql';

const server = new ApolloServer({
    typeDefs,
    resolvers,
    graphqlPath: graphqlEndpoint
});

models.sequelize.sync({force:true}).then(() =>  {
    server.listen(PORT)
});
index.js

import Sequelize from 'sequelize';

var sequelize = new Sequelize('dms', 'postgres', 'postgres', {
    dialect: 'postgres', 
    define: {
        underscored: true,
        freezeTableName: true,
    },
});

const models = {
    Appointments: sequelize.import('./appointment'),
};

Object.keys(models).forEach(modelName => {
    if (models[modelName].associate) {
        models[modelName].associate(models);
    }
});

models.sequelize = sequelize;
models.Sequelize = Sequelize;

export default models;
export default (sequelize, DataTypes) => {
    const Appointment = sequelize.define("appointment",
        {
            status: {
                type: DataTypes.STRING
            },
            appointmentStart: {
                type: DataTypes.DATE,
            },
            appointmentEnd: {
                type: DataTypes.DATE,
            },
        },
    );

    return Appointment;
};
import { ApolloServer, gql} from 'apollo-server';
import typeDefs from './schema';
import resolvers from './resolvers';
import models from './models';

const PORT = 8080;

const graphqlEndpoint = '/graphql';

const server = new ApolloServer({
    typeDefs,
    resolvers,
    graphqlPath: graphqlEndpoint
});

models.sequelize.sync({force:true}).then(() =>  {
    server.listen(PORT)
});
上述MWE的输出SQL如下所示:

Executing (default): DROP TABLE IF EXISTS "appointment" CASCADE;
Executing (default): DROP TABLE IF EXISTS "appointment" CASCADE;
Executing (default): CREATE TABLE IF NOT EXISTS "appointment" ("id"   SERIAL , "status" VARCHAR(255), "appointmentStart" TIMESTAMP WITH TIME ZONE, "appointmentEnd" TIMESTAMP WITH TIME ZONE, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL, "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'appointment' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
可以看出,它不会将
appointmentStart
等字段转换为
appointment\u start

我还尝试在各个模型上声明
下划线:true
,例如:

export default (sequelize, DataTypes) => {
    const Appointment = sequelize.define("appointment",
        {
            status: {
                type: DataTypes.STRING
            },
            appointmentStart: {
                type: DataTypes.DATE,
            },
            appointmentEnd: {
                type: DataTypes.DATE,
            },
        }, { underscored: true }
    );

    return Appointment;
};
这也不行


我觉得我可能错过了一些明显的东西,或者有一个基本的误解。

你使用的是什么版本的Sequelize?我猜是v4或更早;带下划线的
选项仅适用于v5或更高版本上的属性/列名

在Sequelize v4中,
下划线:true
影响的唯一属性名称是Sequelize在使用
时间戳:true
时创建的生成的时间戳属性;(即,
createdAt
=>
处创建,
updatedAt
=>
处更新等)

sequelize.define()
中声明的模型列不转换为snake-case,您需要在每个camel-case列名上显式设置
字段
属性才能实现这一点。对于上面的
appointmentStart
列,这将如下所示:

...
appointmentStart: {
    type: DataTypes.DATE,
    field: 'appointment_start',
},

您使用的是什么版本的Sequelize?我猜是v4或更早;带下划线的
选项仅适用于v5或更高版本上的属性/列名

在Sequelize v4中,
下划线:true
影响的唯一属性名称是Sequelize在使用
时间戳:true
时创建的生成的时间戳属性;(即,
createdAt
=>
处创建,
updatedAt
=>
处更新等)

sequelize.define()
中声明的模型列不转换为snake-case,您需要在每个camel-case列名上显式设置
字段
属性才能实现这一点。对于上面的
appointmentStart
列,这将如下所示:

...
appointmentStart: {
    type: DataTypes.DATE,
    field: 'appointment_start',
},