## Contributing guide

1. Clone project
2. `pnpm dev`
3. Add tests
4. Fix tests

## Introduction

When you work with the databases

## What is ORM?

ORM is acronym for “Object Relational Mapping”. It is a library that helps developers to work with the database without
leaving comfort of their programming language.

In other words, if your database is e.g. SQL, instead of writing raw sql queries and parsing results, you can functions
provided by ORM library for your programming language (e.g. Typescript).

```jsx
// Without ORM:
const data = db.query("select * from users where login like '%admin%'")
// With ORM:
const data = orm.users.get({ where: { login_contains: 'admin' } })
```

Popular ORMs:

- Entity Framework (C#/.net)
- ServiceStack.OrmLite (C#/.net)
- Hibernate (Java)
- Prisma (TS)
- Drizzle (TS)
- TypeORM (TS)
- MikroORM (TS)
- Sequelize (TS)

[Here](https://www.prisma.io/docs/concepts/overview/prisma-in-your-stack/is-prisma-an-orm) is a good article from Prisma
providing detailed overview of how ORMs work.

## What are the downsides of using ORM?

ORM hides database complexity from the developer, but that has a price.

- “Simple” ORMs (e.g. Prisma) quickly encounter limitations - e.g. sql queries that cannot be represented by ORM.
- “Complex” ORMs that try to support full set of features (e.g. Entity Framework) add their own complexity and introduce
  mental load on top of managing SQL

Consensus among the developer community is to use “simple” ORM, and use raw queries when ORM capabilities is not enough.

## Ok, ORMs are useful. Why create new one?

We wanted to have features that are not supported in current ORMs:

- [This](https://medium.com/@rogerpadillac/in-search-of-the-perfect-orm-e01fcc9bce3d) article gives good overview

# Development tips

## Usage with `npm link`

When you want to test changes in this package, it may be useful to test with `pnpm link`.

But due to specifics of how this package uses peer dependencies, it won't work well.

Use file protocol instead:

```
// package.json
{
  "dependencies": {
    "rads-db": "file:../rads-db"
  }
}
```