有没有人自己写过Nodejs ORM

有没有人自己写过Nodejs ORM

请容许我询问一下,本帖不是关于Node,而是关于.NET :) 最近在研究C#当中的Attribute和Reflection,想自己写一个个人的ORM 就是在主键的设置和关系的映射还不是很了解,有没有朋友实现过。 或者有没有这方面的研究资料。:)

10 回复

当然可以!以下是关于如何用 Node.js 自己编写一个简单的 ORM 的讨论。

标题:有没有人自己写过 Node.js ORM?

内容:

大家好,

我想了解一下,有没有人自己写过 Node.js 的 ORM(对象关系映射)?我最近在尝试自己动手写一个简单的 ORM,主要目的是更好地理解数据库操作背后的机制。

什么是 ORM?

ORM 是一种编程技术,用于将对象模型与关系型数据库之间的数据进行转换。简单来说,ORM 允许你通过操作对象的方式来操作数据库,而不需要直接编写 SQL 语句。

示例代码

下面是一个非常简单的 Node.js ORM 示例:

const sqlite3 = require('sqlite3').verbose();

class SimpleORM {
    constructor(dbPath) {
        this.db = new sqlite3.Database(dbPath, (err) => {
            if (err) {
                console.error(`无法打开数据库: ${err.message}`);
                return;
            }
            console.log('成功连接到数据库');
        });
    }

    // 定义表结构
    createTable(tableName, schema) {
        const columns = Object.keys(schema).map(key => `${key} ${schema[key]}`).join(', ');
        const query = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns})`;
        this.db.run(query);
    }

    // 插入数据
    insert(tableName, data) {
        const keys = Object.keys(data);
        const values = keys.map(key => `'${data[key]}'`).join(', ');
        const query = `INSERT INTO ${tableName} (${keys.join(', ')}) VALUES (${values})`;
        this.db.run(query);
    }

    // 查询数据
    select(tableName, conditions = {}) {
        const whereClause = Object.keys(conditions).map(key => `${key} = '${conditions[key]}'`).join(' AND ');
        const query = `SELECT * FROM ${tableName} ${whereClause ? `WHERE ${whereClause}` : ''}`;
        this.db.all(query, [], (err, rows) => {
            if (err) throw err;
            console.log(rows);
        });
    }
}

// 使用示例
const orm = new SimpleORM('./test.db');
orm.createTable('users', { id: 'INTEGER PRIMARY KEY', name: 'TEXT', age: 'INTEGER' });

orm.insert('users', { name: 'Alice', age: 25 });
orm.insert('users', { name: 'Bob', age: 30 });

orm.select('users', { name: 'Alice' });

关键点解释

  • 创建表createTable 方法接受表名和字段定义来创建表。
  • 插入数据insert 方法接受表名和数据对象,生成并执行插入语句。
  • 查询数据select 方法接受表名和条件对象,生成并执行查询语句。

主键和关系

在这个简单的示例中,我们没有涉及主键和关系的映射。对于主键,可以在创建表时指定 PRIMARY KEY。对于关系,可以考虑使用外键约束,并通过嵌套查询或联接来处理多对一或多对多的关系。

希望这个示例能给你一些启发,如果你有更多具体的需求或问题,欢迎继续讨论!


希望这个回答对你有所帮助!如果你有任何其他问题,也欢迎继续提问。


为何要造轮子:(

以前用PHP写过,现在觉得是在浪费生命

实现过一个简单的,可以和mongo / mysql / postgre 相连。对mysql / postgre,对象字段serilize到字符串再存,不能直接搜索。

开源软件很多~ 而且EF6不是挺好用嘛~CodeFirst多爽 10年以前用代码生成器 搞过ORM

少用ORM吧,坑……我喜欢煎蛋粗暴

有个基于 bearcat 的 O/R mapping dao 框架可以参考一下 bearcat-dao

citong-db, 可以试下

当然有人自己写过 Node.js 的 ORM。虽然这个问题是关于 .NET 的,但我可以为你提供一个简单的 Node.js ORM 示例,以帮助你理解如何构建自己的 ORM。

示例代码

class SimpleORM {
    constructor(tableName) {
        this.tableName = tableName;
        this.db = require('sqlite3').verbose().database(':memory:');
        this.initTable();
    }

    initTable() {
        const sql = `CREATE TABLE IF NOT EXISTS ${this.tableName} (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            age INTEGER
        )`;
        this.db.run(sql);
    }

    create(data) {
        const sql = `INSERT INTO ${this.tableName} (name, age) VALUES (?, ?)`;
        this.db.run(sql, [data.name, data.age]);
    }

    read(id) {
        const sql = `SELECT * FROM ${this.tableName} WHERE id = ?`;
        return new Promise((resolve, reject) => {
            this.db.get(sql, [id], (err, row) => {
                if (err) return reject(err);
                resolve(row);
            });
        });
    }

    update(id, data) {
        const sql = `UPDATE ${this.tableName} SET name = ?, age = ? WHERE id = ?`;
        this.db.run(sql, [data.name, data.age, id]);
    }

    delete(id) {
        const sql = `DELETE FROM ${this.tableName} WHERE id = ?`;
        this.db.run(sql, [id]);
    }
}

const orm = new SimpleORM('users');
orm.create({ name: 'Alice', age: 30 });
orm.read(1).then(console.log);
orm.update(1, { name: 'Bob', age: 40 });
orm.delete(1);

解释

  1. 类定义:我们定义了一个 SimpleORM 类,它接收一个表名作为参数,并初始化 SQLite 数据库。
  2. 初始化表initTable 方法创建一个名为 tableName 的表,包含 id, nameage 字段。
  3. CRUD 操作
    • create 方法用于插入数据。
    • read 方法用于读取数据。
    • update 方法用于更新数据。
    • delete 方法用于删除数据。

这个示例展示了如何使用 JavaScript 和 SQLite 来创建一个简单的 ORM。你可以在此基础上扩展更多的功能,例如关系映射、属性映射等。

如果你需要更多关于关系映射和属性映射的信息,可以参考一些现有的 ORM 库,如 Sequelize 或 Mongoose,这些库提供了更全面的功能和文档。

回到顶部