热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Sequelizeunderscoredoptionnotfunctioningasexpected

如何解决《Sequelizeunderscoredoptionnotfunctioningasexpected》经验,为你挑选了1个好方法。

I've been following Ben Awad's tutorials on YouTube. Specifically I'm using sequelize to set up a PostgreSQL database as he outlines.

I want to define my fields in camel case and have them converted to snake case as he does in his tutorials, specifically here, also outlined in the sequelize docs. However when I do the same my table fields are not converted to snake case.

Here's a MWE of the code I'm using:

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;

From the file above it is my understanding that define: {underscored: true} should convert all table fields to snake case, as stated in his tutorial video above.

models/appointment.js

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

    return Appointment;
};

index.js

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)
});

The output SQL from the above MWE is as follows:

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;

As can be seen, it does not convert fields such as appointmentStart to appointment_start.

I have also tried declaring underscored: true on the indiviudal models, such as the following:

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;
};

This too does not work.

我觉得我可能会遗漏一些明显的东西,或者有根本的误解。



1> 小智..:

您正在使用哪个版本的Sequelize?我猜是v4或更早的版本;该underscored选项仅适用于v5或更高版本上的属性/列名称。

在Sequelize v4中,唯一underscored: true会影响的属性名称timestamps: true是使用Sequelize时创建的时间戳属性。(即createdAt=> created_atupdatedAt=> updated_at等),

在您声明的模型列中sequelize.define(),不要将其转换为蛇形,您需要field在每个驼峰式列名称上显式设置属性,以实现此目的。对于appointmentStart上面的列,它看起来像:

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


推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
xiao15387977702
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有