loopbackio / loopbackio/loopback-next

[@loopback/sequelize] Duplicate column names in relation queries

Ouverte
#9,617 2 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug sequelize
Langage dominant
TypeScript
Étoiles
5.1k
Forks
1.1k
Merge moyen
2 j 21 h
PR mergées (30 j)
27

Description

### Describe the bug

Repository queries with relations that do not explicitly set all the keyTo / keyFrom / through properties will lead to broken SQL queries that contain duplicated title case column names mixed in with the expected camelcase columns.

Example:
```sql
SELECT bookid as bookId, reader.id as readerId, ReaderId …
```

Relates to:
https://github.com/sequelize/sequelize/issues/9328
https://github.com/loopbackio/loopback-next/issues/9591
https://github.com/sourcefuse/loopback4-sequelize/issues/35

### Logs

_No response_

### Additional information

Workaround seems to be to go through all the Entity relations and explicitly set all the relation key names but that can be time-consuming and error-prone with a larger project. It seems like it might be possible to mitigate this at the loopback model to Sequelize relation layer.

### Reproduction

With these changes, running the tests for the Sequelize extension will replicate the error:
https://github.com/KalleV/loopback-next/commit/3c29d852b46f19f4805d556ae32aee49c79471f1

Turns out it's necessary to define additional "belongsTo" relations in other entities before this happens. The extra relation is added to the "Patient" entity in this case. With this set up, I am seeing the following happen:
- The default relation properties are set by Loopback (i.e. I can see the "keyFrom" is populated as todoListId) but the "keyTo" is undefined:
![loopback_relation_data](https://github.com/loopbackio/loopback-next/assets/5942028/5f9e6897-65ec-419c-a73c-ba11fe84193c)
- This leads to undefined being passed as the foreign key to sequelize:
![undefined_foreign_key](https://github.com/loopbackio/loopback-next/assets/5942028/bc3cea83-b6fe-4664-b97e-d722a01d07cb)
- And then that causes Sequelize to assign a Title Case property through it's own default relation column logic leading to a duplicate column name in the database query:
![duplicate_column_sqlite_error](https://github.com/loopbackio/loopback-next/assets/5942028/8cff7599-28ac-4368-93fe-5d8254ff1778)

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par les tests d’extension de Sequelize et les modifications de reproduction du commit 3c29d852b46f19f4805d556ae32aee49c79471f1. Examinez la configuration de la relation Patient et le traitement de keyFrom, keyTo et through avant que la requête n’atteigne Sequelize. La tâche est terminée lorsque les relations dont toutes les propriétés ne sont pas définies explicitement ne produisent plus de colonnes en double, avec une couverture de régression dans les tests d’extension.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
node.js, typescript
Domaine
api, backend, database
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.