关于dresende / node-orm 在Nodejs中的使用问题

关于dresende / node-orm 在Nodejs中的使用问题

诸位好,我在使用dresende / node-orm 去连接Mysql的时候,出现了日期不能读出的问题: 我在Mysql中存有一条记录,其中有个DateTime类型的字段:1888-08-08 12:12:12 ,然后我用node-orm读出来以后,再保存,就把数据库中的记录覆盖成了 0000-00-00 00:00:00,再次读出就成为了Invalid Date,请问各位有没有遇到这种问题? 附上node-orm的git地址https://github.com/dresende/node-orm/ 另外,如果有更好的orm,已经在用的,可否推荐一下,谢谢!


11 回复

关于 dresende/node-orm 在 Node.js 中的使用问题

你好,你在使用 dresende/node-orm 连接 MySQL 数据库时遇到了日期无法正确读取的问题。这可能是因为 node-orm 对日期类型的处理不够完善。以下是一些可能的解决方案和替代方案。

解决方案

首先,确保你已经安装了 node-orm 和 MySQL 驱动:

npm install node-orm mysql

然后,你可以尝试手动处理日期格式,以确保它们能够正确读取和写入数据库。例如,可以使用 momentdate-fns 等库来处理日期格式。

示例代码:

const orm = require('node-orm');
const moment = require('moment');

// 连接到 MySQL 数据库
orm.connect({
    datasource: 'mysql',
    hostname: 'localhost',
    database: 'testdb',
    username: 'root',
    password: 'password'
}, function (err, db) {
    if (err) throw err;

    // 定义模型
    db.define('mytable', {
        id: { type: 'serial', key: true },
        date_field: { type: 'datetime' }
    });

    // 查询数据
    db.models.mytable.find({ where: { id: 1 } }, function (err, records) {
        if (err) throw err;

        // 手动处理日期格式
        records.forEach(record => {
            const originalDate = record.date_field;
            const formattedDate = moment(originalDate).format('YYYY-MM-DD HH:mm:ss');
            console.log(`Original Date: ${originalDate}`);
            console.log(`Formatted Date: ${formattedDate}`);

            // 更新记录
            record.date_field = formattedDate;
            record.save(function (err) {
                if (err) throw err;
                console.log('Record updated successfully');
            });
        });
    });
});

在这个示例中,我们使用 moment 库来格式化日期,确保日期在读取和保存时不会被错误地转换为无效日期。

替代方案

如果你发现 dresende/node-orm 的日期处理问题难以解决,可以考虑使用其他 ORM 库,例如 sequelizetypeorm。这些库提供了更强大的功能和更好的社区支持。

Sequelize 示例:

npm install sequelize mysql2
const Sequelize = require('sequelize');

const sequelize = new Sequelize('testdb', 'root', 'password', {
    host: 'localhost',
    dialect: 'mysql'
});

const MyTable = sequelize.define('mytable', {
    id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true },
    date_field: { type: Sequelize.DATE }
}, {
    timestamps: false
});

sequelize.sync().then(() => {
    return MyTable.findOne({ where: { id: 1 } }).then(record => {
        console.log(`Original Date: ${record.date_field}`);
        record.date_field = new Date(record.date_field);
        return record.save();
    });
});

通过这些示例,你可以更好地理解如何处理日期问题,并选择更适合你的项目需求的 ORM 库。希望这些信息对你有所帮助!


木有人给点建议吗。。

new Date() //不是只用 Date()

你保存之前得查一下,不能把无效数据存回去。

没用过 node-orm

感谢回复,我那时用的是new Date()。 那个node-orm我用的时候有好多问题,看他更新也不是很勤快,后来就没用了

谢谢回复。我没改过那些字段,是指读取-》保存-》读取-》保存。 后来不用mysql和node-orm了。 你一般node读写mysql的时候用什么工具啊?

mysql orm 不如用一下这个…用的人多…bug 修复得也快… https://github.com/sequelize/sequelize

恩,听过。后来用mongo后就没关注了。

使用时间戳类型

在使用 dresende/node-orm 连接 MySQL 数据库时遇到日期格式处理问题是很常见的。通常情况下,日期格式不正确可能是因为日期格式在转换过程中发生了错误。

解决方案

你可以通过自定义日期格式解析来解决这个问题。以下是一个简单的示例,展示如何使用 node-orm 正确处理日期格式:

const orm = require('orm');
const mysql = require('mysql');

// 配置数据库连接
orm.connect({
    host: 'localhost',
    port: 3306,
    database: 'your_database_name',
    user: 'your_username',
    password: 'your_password',
    dialect: 'mysql'
}, function(err, db) {
    if (err) throw err;

    // 定义模型
    let User = db.define('user', {
        name: { type: String, size: 50 },
        birthday: { type: 'date' }
    });

    // 插入数据
    let newUser = User.create({
        name: 'John Doe',
        birthday: new Date('1888-08-08T12:12:12')
    }, function(err, savedUser) {
        if (err) throw err;
        
        console.log(savedUser);
    });
});

关于ORM的推荐

如果你正在寻找更现代、更易于使用的 ORM 库,可以考虑以下几种选择:

  1. Sequelize:一个非常强大的 ORM,支持多种数据库,并且文档齐全。

  2. Mongoose:专门为 MongoDB 设计的,如果使用 MongoDB 的话,这是一个不错的选择。

  3. TypeORM:一个 TypeScript 驱动的 ORM,适用于 Node.js 和 JavaScript,支持多种数据库。

这些 ORM 库通常比 node-orm 更为现代,并且有更好的社区支持和文档。

回到顶部