ORMs And Migrations

ORMs And Migrations

5 min read

Description of ORMs And Migrations

Introduction

English

Object-Relational Mapping and Migrations are fundamental concepts in the world of SQL and relational databases. ORMs offer a convenient way to interact with databases using programming languages, abstracting the intricacies of SQL for developers. From data modeling to SQL building and ad-hoc queries, different ORMs provide different features, interfaces and levels of control suitable for diverse use cases and user preferences.

Comparatively, migrations refer to controlled changes or modifications performed on a database's scheme over time, underpinning the evolution, flexibility, and adaptability of project databases to changing specifications or requirements. Whether it involves creating tables, adding indices, altering column types or other tasks, migrations eliminate the necessity of manually changing the database schema.

We will contrast popular ORMs, with a focus on data modeling capabilities, SQL building, ad-hoc queries, and the degree of precise control they offer developers. Subsequently, we will delve into database migrations, further highlighting the functionality and impact they possess in the context of SQL and relational databases. From creating a new database to tracking changes and ensuring database integrity, different migration strategies offer differing degrees of control and simplicity worthwhile for database management.

Français

La mise en correspondance Objet-Relationnelle et les migrations sont des concepts fondamentaux dans le monde de SQL et des bases de données relationnelles. Les ORM offrent un moyen pratique d'interagir avec les bases de données en utilisant des langages de programmation, en résumant les complexités de SQL pour les développeurs. De la modélisation des données à la création de SQL et aux requêtes ad-hoc, différents ORM offrent différents caractéristiques, interfaces et niveaux de contrôle adaptés à divers cas d'utilisation et préférences utilisateur.

Comparativement, les migrations font référence aux changements ou modifications contrôlés effectués sur le schéma d'une base de données au fil du temps, soutenant l'évolution, la flexibilité et l'adaptabilité des bases de données de projet aux spécifications ou exigences changeantes. Qu'il s'agisse de créer des tables, d'ajouter des indices, de modifier des types de colonnes ou d'autres tâches, les migrations éliminent la nécessité de changer manuellement le schéma de la base de données.

Nous comparerons les ORM populaires, en mettant l'accent sur les capacités de modélisation des données, la création de SQL, les requêtes ad-hoc, et le degré de contrôle précis qu'ils offrent aux développeurs. Par la suite, nous nous plongerons dans les migrations de bases de données, en mettant encore plus en évidence la fonctionnalité et l'impact qu'elles ont dans le contexte de SQL et des bases de données relationnelles. De la création d'une nouvelle base de données au suivi des modifications et à l'assurance de l'intégrité de la base de données, différentes stratégies de migration offrent des degrés de contrôle et de simplicité différents qui valent la peine pour la gestion des bases de données.

Definitions

ORMs

English

ORMs, or Object-Relational Mapping, is a programming technique used to convert or map data between incompatible type systems in relational databases and object-oriented programming languages. SQL and relational databases work exceptionally well with ORMs as they allow applications to manage a database using object-oriented techniques.

In the context of SQL and relational databases, the concept of this mapping comes in when trying to translate relational database concepts into object-oriented concepts.

Here's how this works:

  1. Tables become classes: In an object-oriented framework, classes are used to define objects. In a relational database, those classes usually correlate directly with database tables.

  2. Rows become Objects: Just like every row in a database table represents a single item, each instance (or object) of a class represents a single item in the application.

  3. Columns become Object Attributes: The individual pieces of data that are stored for every item in a table, the columns, become the attributes of the object in the application.

ORMs deal with the mismatch problem between the object-oriented and relational world by putting a 'virtual object database' that can be manipulated with using the popular object-oriented paradigm.

A major advantage of using ORMs is that they enable developers to work in a high-level programming language, which simplifies the code and reduces the likelihood of errors. This includes creating, reading, updating, and deleting records in the underlying database. ORMs can also help encapsulate the database structure and isolate changes in one place if the database structure changes.

However, ORMs can introduce performance penalties and may not be suitable for applications with complex queries or intensive database operations as they may not optimize SQL queries as effectively as hand-written SQL.

Examples of ORMs include Hibernate in Java, Sequelize in JavaScript, and SQLAlchemy in Python. Developers often choose an ORM that suits their project requirements and their preferred programming language.

In conclusion, using ORMs in relation to SQL and relational databases benefits by easing the data management and creating a more scalable and maintainable application. However, they should be chosen prudently considering the complexity and performance requirements of the application.

Français

Les ORM, ou Mappage Objet-Relationnel, sont une technique de programmation utilisée pour convertir ou mapper des données entre des systèmes de types incompatibles dans les bases de données relationnelles et les langages de programmation orientés objet. SQL et les bases de données relationnelles fonctionnent exceptionnellement bien avec les ORM, car ils permettent aux applications de gérer une base de données en utilisant des techniques orientées objet.

Dans le contexte de SQL et des bases de données relationnelles, le concept de ce mappage intervient lorsqu'on essaye de traduire les concepts de base de données relationnelles en concepts orientés objet.

Voici comment cela fonctionne :

  1. Les tables deviennent des classes : Dans un environnement orienté objet, les classes sont utilisées pour définir des objets. Dans une base de données relationnelle, ces classes correspondent généralement directement aux tables de la base de données.

  2. Les rangées deviennent des objets : Tout comme chaque rangée d'une table de base de données représente un seul élément, chaque instance (ou objet) d'une classe représente un seul élément dans l'application.

  3. Les colonnes deviennent des attributs d'objet : Les pièces individuelles de données qui sont stockées pour chaque élément dans une table, les colonnes, deviennent les attributs de l'objet dans l'application.

Les ORM traitent le problème d'incompatibilité entre le monde orienté objet et le monde relationnel en créant une 'base de données d'objet virtuelle' qui peut être manipulée en utilisant le paradigme orienté objet populaire.

Un avantage majeur de l'utilisation des ORM est qu'ils permettent aux développeurs de travailler dans un langage de programmation de haut niveau, ce qui simplifie le code et réduit la probabilité d'erreurs. Cela inclut la création, la lecture, la mise à jour et la suppression d'enregistrements dans la base de données sous-jacente. Les ORM peuvent également aider à encapsuler la structure de la base de données et à isoler les modifications en un seul endroit si la structure de la base de données change.

Cependant, les ORM peuvent introduire des pénalités de performance et peuvent ne pas convenir aux applications avec des requêtes complexes ou des opérations intensives de base de données car ils peuvent ne pas optimiser les requêtes SQL aussi efficacement que le SQL écrit à la main.

Des exemples d'ORM incluent Hibernate en Java, Sequelize en JavaScript et SQLAlchemy en Python. Les développeurs choisissent souvent un ORM qui convient à leurs exigences de projet et à leur langage de programmation préféré.

En conclusion, utiliser des ORM par rapport à SQL et aux bases de données relationnelles bénéficie en facilitant la gestion des données et en créant une application plus évolutive et maintenable. Cependant, ils devraient être choisis prudemment en tenant compte de la complexité et des exigences de performance de l'application.

Migrations

English

Database migrations refer to the management of changes or modifications that are applied to a database. This process predominantly deals with any alterations or updates in the schema of a database. However, it also concerns itself with every aspect that changes the state and structure of a database like adding, altering, dropping columns and tables, indexing, transformations of data etc.

The term migration is used because these changes or modifications can be moved across various machines and systems, typically from a development environment to a production environment.

Migrations can occur for numerous reasons such as enhancing database functionality, altering the structure of a database to match new business requirements, resolving bugs, or improving system performance.

For managing these migrations, tools and software are used that help apply the changes to the database. They also allow for rolling back in case of errors or issues, making them an essential aspect of modern database management and software development life cycle.

The objective of the Database Migration is to transfer database schema and data from one environment to the other without hindering or minimizing the application downtime.

Overall, database migrations are crucial in maintaining the integrity, performance, and health of a database throughout its lifecycle.

Français

Les migrations de base de données se réfèrent à la gestion des changements ou des modifications qui sont appliqués à une base de données. Ce processus traite principalement de toutes les modifications ou mises à jour dans le schéma d'une base de données. Cependant, il s'occupe également de tous les aspects qui modifient l'état et la structure d'une base de données, comme l'ajout, la modification, la suppression de colonnes et de tables, l'indexation, les transformations de données, etc.

Le terme de migration est utilisé parce que ces changements ou modifications peuvent être déplacés à travers différentes machines et systèmes, typiquement d'un environnement de développement à un environnement de production.

Les migrations peuvent se produire pour diverses raisons telles que l'amélioration des fonctionnalités de la base de données, la modification de la structure de la base de données pour correspondre à de nouvelles exigences commerciales, la résolution de bugs, ou l'amélioration des performances du système.

Pour gérer ces migrations, des outils et des logiciels sont utilisés qui aident à appliquer les modifications à la base de données. Ils permettent également de revenir en arrière en cas d'erreurs ou de problèmes, ce qui en fait un aspect essentiel de la gestion moderne des bases de données et du cycle de vie du développement de logiciels.

L'objectif de la Migration de Base de Données est de transférer le schéma de base de données et les données d'un environnement à un autre sans entraver ou minimiser le temps d'arrêt de l'application.

Dans l'ensemble, les migrations de bases de données sont cruciales pour maintenir l'intégrité, les performances et la santé d'une base de données tout au long de son cycle de vie.

Drivers and Dialects

English

  1. SQL Drivers: SQL drivers act as an interface or bridge between software applications and databases. These are software components that enable a program to communicate and interact with databases. SQL drivers allow applications to establish a connection, read, write, authenticate, and perform transactions with a database using SQL commands. In practice, various types of SQL drivers include JDBC (Java Database Connectivity) driver for Java applications, ODBC (Open Database Connectivity) driver for applications that use ODBC API, and ADO.NET drivers for .NET applications.

For example, if you're building a Java application that interacts with a MySQL database, you'd need a JDBC driver specifically designed to implement the JDBC API for MySQL databases. The driver understands how to translate function calls, routines, and SQL commands from the Java application into a format that the MySQL database can understand and process effectively.

  1. SQL Dialects: SQL dialects refer to the variant or version of the SQL (Structured Query Language) that specific database management systems (DBMS) use. SQL is a standardized language used for managing and manipulating relational databases. While ANSI (American National Standards Institute) has provided a standard for SQL, which ensures consistent usage across different systems, each DBMS often introduces additional proprietary features or syntax to the basic SQL, which results in varying SQL dialects.

For example, MySQL, Oracle Database, PostgreSQL, and SQL Server, all have their unique SQL dialects. While the basic SQL commands like `SELECT`, `UPDATE`, `DELETE`, `INSERT`, and `WHERE` are usually the same across all SQL dialects, there are differences when it comes to advanced features, such as error handling, stored procedures, and string concatenation syntax. This means developers must understand the particular SQL dialect they are working with, especially when migrating or integrating different databases systems.

Français

  1. Pilotes SQL : Les pilotes SQL agissent comme une interface ou un pont entre les applications logicielles et les bases de données. Ce sont des composants logiciels qui permettent à un programme de communiquer et d'interagir avec des bases de données. Les pilotes SQL permettent aux applications d'établir une connexion, de lire, d'écrire, de s'authentifier et d'effectuer des transactions avec une base de données à l'aide de commandes SQL. Dans la pratique, différents types de pilotes SQL comprennent le pilote JDBC (Java Database Connectivity) pour les applications Java, le pilote ODBC (Open Database Connectivity) pour les applications qui utilisent l'API ODBC, et les pilotes ADO.NET pour les applications .NET.

    Par exemple, si vous construisez une application Java qui interagit avec une base de données MySQL, vous auriez besoin d'un pilote JDBC spécifiquement conçu pour mettre en œuvre l'API JDBC pour les bases de données MySQL. Le pilote comprend comment traduire les appels de fonction, les routines et les commandes SQL de l'application Java dans un format que la base de données MySQL peut comprendre et traiter efficacement.

  2. Dialectes SQL : Les dialectes SQL font référence à la variante ou à la version du SQL (Structured Query Language) utilisé par certains systèmes de gestion de bases de données (DBMS). Le SQL est un langage standardisé utilisé pour gérer et manipuler les bases de données relationnelles. Bien que l'ANSI (American National Standards Institute) ait fourni une norme pour le SQL, qui assure une utilisation constante sur différents systèmes, chaque DBMS introduit souvent des fonctionnalités propriétaires ou une syntaxe supplémentaires au SQL de base, ce qui résulte en différents dialectes SQL.

    Par exemple, MySQL, Oracle Database, PostgreSQL et SQL Server ont tous leurs dialectes SQL uniques. Alors que les commandes SQL de base comme `SELECT`, `UPDATE`, `DELETE`, `INSERT`, et `WHERE` sont généralement les mêmes dans tous les dialectes SQL, il y a des différences quand il s'agit de fonctionnalités avancées, telles que la gestion des erreurs, les procédures stockées, et la syntaxe de concaténation de chaînes. Cela signifie que les développeurs doivent comprendre le dialecte SQL particulier avec lequel ils travaillent, surtout lorsqu'ils migrent ou intègrent différents systèmes de bases de données.

Examples

English

  • ActiveRecord connects classes to relational database tables to establish an almost zero-configuration persistence layer for applications.

  • Ecto is toolkit for data mapping and language integrated query.

  • SqlAlchemy is The Database Toolkit for Python.

  • Drizzle is a TypeScript ORM for SQL databases designed with maximum type safety in mind.

  • Knex is a batteries-included, multi-dialect (PostgreSQL, MySQL, CockroachDB, MSSQL, SQLite3, Oracle (including Oracle Wallet Authentication)) query builder for Javascript.

  • Conman relies on a dynamic variable to manage the connection. The dynamic variable allows the connection to be rebound contextually for transactions. When working with multiple databases, a separate var is required to track each database connection.

  • HoneySQL is SQL as Clojure data structures. Build queries programmatically -- even at runtime -- without having to bash strings together.

Français

  • ActiveRecord connecte les classes aux tables de base de données relationnelles pour établir une couche de persistance quasi sans configuration pour les applications.

  • Ecto est une boîte à outils pour le mappage de données et la requête intégrée au langage.

  • SqlAlchemy est La Boîte à Outils de Base de Données pour Python.

  • Drizzle est un ORM TypeScript pour les bases de données SQL conçu avec un maximum de sécurité de type à l'esprit.

  • Knex est un constructeur de requêtes multi-dialectes (PostgreSQL, MySQL, CockroachDB, MSSQL, SQLite3, Oracle (y compris l'authentification de portefeuille Oracle)) comprenant des piles, pour Javascript.

  • Conman s'appuie sur une variable dynamique pour gérer la connexion. La variable dynamique permet à la connexion d'être recontextualisée contextuellement pour les transactions. Lorsqu'on travaille avec plusieurs bases de données, une variable distincte est nécessaire pour suivre chaque connexion de base de données.

  • HoneySQL est SQL comme des structures de données Clojure. Construisez des requêtes de manière programmatique - même à l'exécution - sans avoir à assembler des chaînes.

Classifications

Models

English

ActiveRecord, Ecto, SqlAlchemy, Drizzle rely on the concept of models that are static, because models need to be defined before they can be used.

Remarks

  1. Easy Data Management: Models in Object Relational Mapping (ORM) provide a simple and effective way to create, retrieve, update, and delete records in your database, using object-oriented syntax.

  2. Database Agnostic: The ORM serve as an abstraction layer, allowing developers to switch between different databases with minimal changes in the code.

  3. Streamlined Code: Models help to streamline code and reduce the amount of SQL developers need to write, which in turn results in cleaner, easier-to-understand code.

  4. Enhanced Security: They provide developers with a secure way of handling database operations, protecting against attacks like SQL injection.

  5. Improved Productivity: Models can significantly speed up the development process. This is mainly due to the fact that developers can focus more on the business logic of the application, rather than on writing complex SQL queries.

  6. Encapsulates Business Logic: Models keep related methods together, providing better code organization than just keeping all code in a controller.

  7. Support for Database Relationships: ORM Models can also simplify working with related tables through relationships like one-to-one, one-to-many, and many-to-many.

  8. Maintainability: With models, developers can change the database schema and conveniently migrate the changes into the existing database without altering the codebase.

  9. Scalable: With automated database schema updates and other features, ORMs using models can easily scale to meet the needs of a growing application.

  10. Integration with Other Libraries: Most ORMs provide ways to easily integrate with other existing libraries or tools, thus enriching the application with more complex functionalities.

Français

ActiveRecord, Ecto, SqlAlchemy, Drizzle s'appuient sur le concept de modèles qui sont statiques, parce que les modèles doivent être définis avant de pouvoir être utilisés.

Remarques

  1. Gestion facile des données: Les modèles dans le mappage objet-relationnel (ORM) fournissent un moyen simple et efficace de créer, récupérer, mettre à jour et supprimer des enregistrements dans votre base de données, en utilisant une syntaxe orientée objet.

  2. Indépendant de la base de données: L'ORM sert de couche d'abstraction, permettant aux développeurs de passer d'une base de données à une autre avec un minimum de modifications dans le code.

  3. Code simplifié: Les modèles aident à rationaliser le code et à réduire la quantité de SQL que les développeurs doivent écrire, ce qui se traduit par un code plus propre et plus facile à comprendre.

  4. Sécurité améliorée: Ils fournissent aux développeurs un moyen sûr de gérer les opérations de base de données, protégeant contre des attaques comme l'injection SQL.

  5. Productivité améliorée: Les modèles peuvent accélérer significativement le processus de développement. Cela est principalement dû au fait que les développeurs peuvent se concentrer davantage sur la logique métier de l'application, plutôt que sur l'écriture de requêtes SQL complexes.

  6. Encapsule la logique métier: Les modèles gardent les méthodes connexes ensemble, offrant une meilleure organisation du code que de simplement garder tout le code dans un contrôleur.

  7. Support pour les relations de base de données: Les modèles ORM peuvent également simplifier le travail avec des tables liées à travers des relations comme un-à-un, un-à-plusieurs et plusieurs-à-plusieurs.

  8. Maintenabilité: Avec les modèles, les développeurs peuvent modifier le schéma de la base de données et migrer facilement les changements dans la base de données existante sans modifier le code source.

  9. Evolutif : Avec les mises à jour automatiques du schéma de base de données et d'autres fonctionnalités, les ORM qui utilisent des modèles peuvent facilement monter en charge pour répondre aux besoins d'une application en croissance.

  10. Intégration avec d'autres bibliothèques: La plupart des ORM fournissent des moyens de s'intégrer facilement avec d'autres bibliothèques ou outils existants, enrichissant ainsi l'application avec des fonctionnalités plus complexes.

Ad Hoc queries

English

Knex and HoneySQL are both well suited to perform ad-hoc queries as they allow for building arbitrary SQL statements without requiring a Model or the handling of SQL strings within an application.

Remarks

  1. Security Risk: Interpolating SQL query strings with random input data can lead to SQL injection attacks. This can allow an attacker to manipulate SQL queries, leading to data theft, corruption, or deletion.

  2. Data Integrity: Without proper validation, random input can harm the integrity of the data stored in the database. Unsanitized input may include incorrect or misleading data.

  3. Performance: By interpolating SQL query strings with random input data, the performance optimization of precompiled statements is lost. Each query with different data is treated as a completely separate query by the database engine, which reduces efficiency.

  4. Debugging Difficulty - It becomes difficult to debug SQL queries if they are constructed from random data inputs. Accidental errors, inappropriate data types or syntax errors become hard to track down.

  5. Maintenance: It increases complexity making it challenging to read, understand, maintain or modify SQL queries in the longer term.

  6. Error-Prone: Query strings can become overly complex and more susceptible to errors when dealing with complex input data. There may be unintentional errors like writing a malformatted query, which might lead to application failure.

  7. Compatibility Issues: In case the database schema changes, the application will break at all points where the interpolated SQL strings depend on the old schema.

Français

Knex et HoneySQL sont tous deux bien adaptés pour effectuer des requêtes ad hoc car ils permettent de construire des instructions SQL arbitraires sans nécessiter un Modèle ou la gestion de chaînes SQL au sein d'une application.

Remarques

  1. Risque de sécurité : L'interpolation de chaînes de requêtes SQL avec des données d'entrée aléatoires peut conduire à des attaques par injection SQL. Ceci peut permettre à un attaquant de manipuler les requêtes SQL, entraînant un vol, une corruption ou une suppression de données.

  2. Intégrité des données : Sans validation appropriée, des entrées aléatoires peuvent nuire à l'intégrité des données stockées dans la base de données. Une entrée non désinfectée peut inclure des données incorrectes ou trompeuses.

  3. Performance : En interpolant des chaînes de requêtes SQL avec des données d'entrée aléatoires, l'optimisation de performance des instructions précompilées est perdue. Chaque requête avec des données différentes est traitée comme une requête entièrement séparée par le moteur de la base de données, ce qui réduit l'efficacité.

  4. Difficulté de débogage - Il devient difficile de déboguer les requêtes SQL si elles sont construites à partir de données d'entrée aléatoires. Les erreurs accidentelles, les types de données inappropriés ou les erreurs de syntaxe deviennent difficiles à repérer.

  5. Maintenance : Cela augmente la complexité rendant difficile la lecture, la compréhension, la maintenance ou la modification des requêtes SQL à plus long terme.

  6. Prone aux erreurs: Les chaînes de requêtes peuvent devenir excessivement complexes et plus susceptibles d'erreurs lorsqu'elles traitent des données d'entrée complexes. Il peut y avoir des erreurs involontaires comme l'écriture d'une requête mal formatée, qui pourrait conduire à une défaillance de l'application.

  7. Problèmes de compatibilité : Dans le cas où le schéma de la base de données change, l'application se bloquera à tous les endroits où les chaînes SQL interpolées dépendent de l'ancien schéma.

Control

English

Conman provides the ultimate control out of all of our options since we can directly leverage hand-crafted SQL queries and statements.

Remarks

  1. Efficiency and Speed: Hand-crafted SQL queries optimize database performance and speed. You can fine-tune scripts towards specific data sets, reducing computation and resources required to retrieve data.

  2. Flexibility: Unlike many query builders or ORM tools, hand-writing SQL offers boundless flexibility. You can manipulate data in many different ways, enabling complex queries that other tools might not allow.

  3. Knowledge and Understanding: Writing your own SQL queries enhances your understanding of databases and their operations. You learn how to organize and manage data more effectively when you have a hands-on interaction with your code.

  4. Customization: Custom SQL queries fit specific needs, enabling complex calculations, nested queries, tailored concurrency, or specialized data handling for elaborate and extensive data sets.

  5. Ultimate Control: Hand-crafting SQL queries gives you thorough control over your database and its operations. You dictate exactly how data is fetched, improved, removed, or inserted.

  6. Improved Security: Hand-written queries can be more secure if done correctly. You can implement strict checking and validations to avoid SQL injections and data breaches.

  7. Cross-platform Compatibility: SQL is pretty much uniformly recognized across different databases like Oracle, MySQL, SQL Server etc. So, your hand-written queries can typically be ported across different platforms with minimal changes.

  8. Cost-Effective: Hand-crafted SQL queries can be created and executed without the need for expensive dedicated software, making them cost-effective for developers.

  9. Maintenance: Once you get comfortable with hand-crafting SQL queries, maintaining these queries in the long run could turn out to be easier. You won't have to rely on automated functions that fail when the software's version updates.

  10. Laboratory for Creativity: Hand-crafting SQL queries can transform database organizers into a laboratory for creativity. Crafting an elaborate SQL query feels like assembling a puzzle—a rewarding challenge that brings a greater understanding of the data and its potential uses.

Remember: as with any code, hand-crafted SQL works best when it's written clearly and commented well. Clarity and maintainability are just as important in an SQL context as in any other programming language.

Français

Conman fournit le contrôle ultime parmi toutes nos options puisque nous pouvons directement utiliser des requêtes et des déclarations SQL faites à la main.

Remarques

  1. Efficacité et vitesse : Les requêtes SQL faites à la main optimisent les performances et la vitesse de la base de données. Vous pouvez affiner les scripts pour des ensembles de données spécifiques, ce qui réduit les calculs et les ressources nécessaires pour récupérer les données.

  2. Flexibilité : Contrairement à de nombreux générateurs de requêtes ou outils ORM, l'écriture de SQL à la main offre une flexibilité sans limites. Vous pouvez manipuler les données de nombreuses manières différentes, ce qui permet des requêtes complexes que d'autres outils pourraient ne pas autoriser.

  3. Connaissance et Compréhension : L'écriture de vos propres requêtes SQL améliore votre compréhension des bases de données et de leurs opérations. Vous apprenez à organiser et à gérer les données plus efficacement lorsque vous interagissez de manière pratique avec votre code.

  4. Personnalisation : Les requêtes SQL personnalisées répondent à des besoins spécifiques, permettant des calculs complexes, des requêtes imbriquées, une simultanéité sur mesure, ou une gestion des données spécialisée pour des ensembles de données élaborés et étendus.

  5. Contrôle Ultime : L'élaboration de requêtes SQL à la main vous donne un contrôle complet sur votre base de données et ses opérations. Vous dictez exactement comment les données sont récupérées, améliorées, supprimées ou insérées.

  6. Sécurité Améliorée : Les requêtes écrites à la main peuvent être plus sécurisées si elles sont faites correctement. Vous pouvez mettre en œuvre des vérifications strictes et des validations pour éviter les injections SQL et les violations de données.

  7. Compatibilité Multiplateforme : SQL est quasi universellement reconnu sur différentes bases de données comme Oracle, MySQL, SQL Server, etc. Ainsi, vos requêtes écrites à la main peuvent généralement être transportées sur différentes plateformes avec des modifications minimales.

  8. Rentabilité : Les requêtes SQL faites à la main peuvent être créées et exécutées sans nécessiter de logiciel dédié coûteux, ce qui les rend rentables pour les développeurs.

  9. Maintenance : Une fois que vous êtes à l'aise avec l'écriture de requêtes SQL à la main, il peut s'avérer plus facile de maintenir ces requêtes sur le long terme. Vous n'aurez pas à compter sur des fonctions automatisées qui échouent lorsque la version du logiciel se met à jour.

  10. Laboratoire de Créativité : L'élaboration de requêtes SQL à la main peut transformer les organisateurs de bases de données en un laboratoire de créativité. Créer une requête SQL complexe ressemble à assembler un puzzle : un défi gratifiant qui apporte une meilleure compréhension des données et de leurs utilisations potentielles.

N'oubliez pas : comme pour tout code, le SQL fait à la main fonctionne le mieux lorsqu'il est écrit clairement et bien commenté. La clarté et la maintenabilité sont tout aussi importantes dans un contexte SQL que dans tout autre langage de programmation.

Demo


services:
  db:
    container_name: ubntth_pg
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root
      POSTGRES_DB: ubntth_db
    ports:
      - "5432:5432"
  pgadmin:
    container_name: ubntth_pgadmin4
    image: dpage/pgadmin4
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: root@admin.com
      PGADMIN_DEFAULT_PASSWORD: root
    ports:
      - "5050:80"


export DB_HOST=127.0.0.1
export DB_PORT=5432
export DB_USER=root
export DB_PASS=root
export DB_NAME=ubntth_db
export DB_URL=postgres://root:root@127.0.0.1:5432/ubntth_db


{
  "name": "orms_and_migrations",
  "version": "1.0.0",
  "description": "ORMs and Migrations",
  "main": "run.mjs",
  "scripts": {
    "dev": "bun run.mjs",
    "gen:migration": "drizzle-kit generate:pg --schema=./schema.mjs",
    "run:migration": "bun ./src/schema.mjs",
    "drizzle-studio": "bunx drizzle-kit studio",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "PostgresSQL",
    "Javascript",
    "SQL",
    "Databases"
  ],
  "author": "ChiefKemist",
  "license": "ISC",
  "dependencies": {
    "drizzle-orm": "^0.28.6",
    "elysia": "^0.6.19",
    "pg": "^8.11.3"
  },
  "devDependencies": {
    "@types/pg": "^8.10.2",
    "drizzle-kit": "^0.19.13"
  }
}


/** @type { import("drizzle-kit").Config } */
export default {
  schema: "./schema.mjs",
  driver: 'pg',
  dbCredentials: {
    connectionString: Bun.env.DB_URL,
  }
};


import { drizzle } from "drizzle-orm/node-postgres";
import { Client } from "pg";

export const connect = () => {
    const client = new Client({
        connectionString: "postgres://user:password@host:port/db",
    });

    // or
    const client = new Client({
        host: Bun.env.DB_HOST,
        port: Bun.env.DB_PORT,
        user: Bun.env.DB_USER,
        password: Bun.env.DB_PASS,
        database: Bun.env.DB_NAME,
    });

    await client.connect();
    const db = drizzle(client);

    return db
};


import { pgTable, serial, text, varchar } from "drizzle-orm/pg-core";

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  fullName: varchar('full_name', { length: 256 }),
  //phone: varchar('phone', { length: 256 }),
}, (users) => ({
  nameIdx: index('name_idx').on(users.fullName),
}));

//export const accounts = pgTable('accounts', {
//  id: serial('id').primaryKey(),
//  bankName: varchar('bank_name', { length: 256 }),
//  //accountNumber: varchar('account_number', { length: 256 }),
//  userId: int('user_id').references(() => users.id),
//});


import { drizzle } from "drizzle-orm/postgres-js";
import { migrate } from "drizzle-orm/postgres-js/migrator";
import postgres from "postgres";
import { connect } from "./connection"l

//const sql = postgres("...", { max: 1 })
//const db = drizzle(sql);

const db = connect();

await migrate(db, { migrationsFolder: "drizzle" });

Conclusion

English

The Blub paradox concept, introduced by Paul Graham in an essay discussing the relative merits of different programming languages, pertains to a theoretical programmer who views any language more advanced than their preferred one as redundant and over-complicated due to their inability to comprehend its superior features and capabilities. The name of this concept is derived from the fanciful "Blub" programming language, which sits at the heart of language proficiency. Individuals utilizing "Blub" may view it as having sufficient functionality but may feel intimidated by languages that offer increased abstraction, in contrast to those using more powerful languages, such as Lisp in Graham's perspective, who are able to benefit from its extra features to optimize their coding efficiency.

The "Blub" paradox also has close connections to elements such as Object-Relational Mapping (ORM) choices and SQL and Relational Databases in various ways. Data Modeling and Database Migrations, for example, depend on the ORMs in use. ORMs conceptualized in "Blub" languages offer a linear mapping of rows to objects, aiding with basic actions like CRUD (Create, Read, Update, Delete), and offer additional features like complex transactions, automated schema migrations, and advanced caching, albeit with limitations like leaky abstractions and strictness. ORMs created in Lisp languages, however, appear native due to the use of macros and are capable providing advanced features without compromising productivity or coding efficiency.

In essence, the Blub paradox implies that programmers may unknowingly discount the advanced capabilities of more powerful ORMs and languages due to overestimating the value of the simplicity of familiars ones and underestimating the potential benefits of unfamiliar ones. While ORMs crafted in "Blub" languages may offer the lure of convenience and simplicity, those developed in 'Lisp' or other high-level languages usually present more power and adaptability, particularly when working with complex data manipulation tasks with SQL and relational databases.

Français

Le concept du paradoxe de Blub, introduit par Paul Graham dans un essai discutant des mérites relatifs des différents langages de programmation, concerne un programmeur théorique qui considère tout langage plus avancé que celui qu'il préfère comme redondant et trop compliqué en raison de son incapacité à comprendre ses caractéristiques et capacités supérieures. Le nom de ce concept est dérivé du langage de programmation fantaisie "Blub", qui est au cœur de la maîtrise des langages. Les personnes qui utilisent "Blub" peuvent le considérer comme ayant une fonctionnalité suffisante, mais peuvent se sentir intimidées par les langages qui offrent une abstraction accrue, contrairement à ceux qui utilisent des langages plus puissants, comme Lisp dans la perspective de Graham, qui sont capables de bénéficier de ses fonctionnalités supplémentaires pour optimiser leur efficacité de codage.

Le paradoxe de "Blub" a également des liens étroits avec des éléments tels que les choix de mappage objet-relationnel (ORM) et SQL et les bases de données relationnelles de diverses manières. La modélisation des données et les migrations de base de données, par exemple, dépendent des ORM utilisés. Les ORM conceptualisés dans les langages "Blub" offrent un mappage linéaire des lignes vers les objets, aidant avec des actions de base comme CRUD (Create, Read, Update, Delete), et offrent des fonctionnalités supplémentaires comme des transactions complexes, des migrations de schéma automatisées, et un cache avancé, quoique avec des limitations comme des abstractions fuyantes et de la rigidité. Les ORM créés dans les langages Lisp, cependant, apparaissent natifs en raison de l'utilisation de macros et sont capables de fournir des caractéristiques avancées sans compromettre la productivité ou l'efficacité de codage.

En essence, le paradoxe de Blub implique que les programmeurs peuvent inconsciemment sous-estimer les capacités avancées des ORM et des langages plus puissants en surestimant la valeur de la simplicité de ceux qu'ils connaissent et en sous-estimant les avantages potentiels de ceux qui leur sont inconnus. Alors que les ORM élaborés dans les langages "Blub" peuvent offrir la tentation de la commodité et de la simplicité, ceux développés en 'Lisp' ou autres langages de haut niveau présentent généralement plus de puissance et d'adaptabilité, en particulier lorsqu'on travaille avec des tâches de manipulation de données complexes avec SQL et les bases de données relationnelles.