【问题标题】:sequelize for Node.js : ER_NO_SUCH_TABLENode.js 的续集:ER_NO_SUCH_TABLE
【发布时间】:2012-12-09 18:31:42
【问题描述】:

我是 sequelize 和 Node.js 的新手。
我为测试续集进行了编码,但发生了错误“ER_NO_SUCH_TABLE:表'db.node_tests'不存在”
错误很简单。
但是,我想从“node_test”表中获取数据。
我认为 sequelize 会附加 's' 字符。

有我的源代码。

var Sequelize = require('sequelize');

var sequelize = new Sequelize('db', 'user', 'pass');
var nodeTest = sequelize.define('node_test',
        { uid: Sequelize.INTEGER 
         , val: Sequelize.STRING} );

nodeTest.find({where:{uid:'1'}})
    .success(function(tbl){
        console.log(tbl);
    });

我已经创建了“node_test”表,并使用mysql客户端插入了数据。

我是否误解了用法?

【问题讨论】:

  • 我正在使用 Mysql 5.5.28 / sequelize 1.6.0-beta4 / Node.js 0.8.15。

标签: node.js sequelize.js


【解决方案1】:

我找到了我自己的问题的答案。

我在后面附加了 Sequelize 方法选项。 {define:{freezeTableName:true}}

然后sequelize不在表名后追加's'字符。

【讨论】:

    【解决方案2】:

    虽然答案效果很好,但我现在建议在声明模型时使用tableName 选项:

    sequelize.define('node_test', { 
      uid: Sequelize.INTEGER,
      val: Sequelize.STRING
    }, {
       tableName: 'node_test'
    });
    

    http://docs.sequelizejs.com/manual/tutorial/models-definition.html

    【讨论】:

    • 感谢您的新回答。我会试试看。 :)
    • @sdepold 您可能希望更新文档链接。
    【解决方案3】:

    Sequelize 默认使用传递的模型名称的复数形式。因此它将查找表“node_tests”或“NodeTests”。如果您愿意,它也可以为您创建表格。

    nodeTest.sync().success(function() {
      // here comes your find command.
    })
    

    如果该表尚不存在,Sync 将尝试创建该表。您还可以使用sync({ force: true }) 删除现有表并从头开始创建一个新表。检查命令行上的 SQL 命令以了解有关正在发生的事情的更多详细信息。

    【讨论】:

    • 感谢您的帮助。 :)
    • 不客气。如果您需要更多信息,请告诉我。
    • 只是一个侧面不是:dresende/node-orm2 模块给了我相同的Error: ER_NO_SUCH_TABLE...在添加数据之前,您需要第一次调用sync()
    【解决方案4】:

    将模型定义为现有表时,需要设置两个选项用于sequelize:

    1. 按原样找到您的表名并
    2. 不用担心 sequelize 的默认列 updatedAtcreatedAt 是它所期望的。

    像这样简单地添加两个选项:

    var nodeTest = sequelize.define('node_test',
            { uid: Sequelize.INTEGER , val: Sequelize.STRING},
            { freezeTableName: true , timestamps: false} //add both options here
    );
    

    注意options参数:

        sequelize.define('name_of_your_table',
        {attributes_of_your_table_columns},
        {options}
         );
    

    在使用 sequelize 方法(例如 nodeTest.findAll())时,缺少任何一个选项都会触发相应的错误。

    > ER_NO_SUCH_TABLE    //freezeTableName
    > ER_BAD_FIELD_ERROR  //timestamps
    

    或者,您可以:

    1. 通过 sequelize 创建一个新表。它会将“s”附加到表名并创建两个时间戳列作为默认值或
    2. 使用 sequelize-auto,这是一个很棒的 npm 包,可以通过编程方式从现有数据库生成续集模型。

    这里是选项配置的续集documentation

    【讨论】:

      【解决方案5】:

      在我的情况下,这是由于情况。我有:

      sequelize.define('User', {
      

      正确的做法是使用小写:

      sequelize.define('user', {
      

      【讨论】:

        猜你喜欢
        • 2021-04-14
        • 2014-05-28
        • 2019-02-14
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 2013-01-17
        相关资源
        最近更新 更多