Écrire directement dans la base de données

Quelqu’un a-t-il déjà travaillé pour lire/écrire directement dans la base de données ? Au début, j’ai essayé d’utiliser l’API pour créer des fils de discussion et des publications, mais c’était trop peu fiable, alors maintenant je cherche à écrire directement dans la base de données.

Les données que je veux insérer sont assez simples : (titre du fil, auteur, catégorie, corps du texte) et pour les publications (auteur, corps du texte).

Cependant, je soupçonne que divers champs supplémentaires doivent également être remplis et peut-être que des recherches doivent être effectuées dans la base de données des utilisateurs.

Je vais partir de zéro, donc je cherche à voir si quelqu’un l’a déjà fait ou a des conseils sur les structures de table ou les points à surveiller.

j’ai oublié que je dois également ajouter la date/l’heure à chacun (je ne peux pas modifier mon message d’origine pour le mettre à jour).

Pourriez-vous partager les problèmes que vous avez rencontrés ?

2 « J'aime »

Vous pouvez voir mes autres publications. Elles concernaient :

  • Problèmes de limitation de débit
  • Problèmes de validation
  • Contournement de validation ne fonctionnant pas de manière cohérente pour les fils par rapport aux sujets

En fin de compte, j’ai pensé qu’il serait plus facile d’aller directement à la base de données.

Au lieu de passer des heures à essayer de gérer les caprices de l’API, en quelques minutes, j’ai réussi à faire fonctionner quelque chose et, espérons-le, de manière plus performante :

Pour ceux qui souhaitent faire de même, voici quelques notes issues de mon exploration jusqu’à présent :

Entrez d’abord dans le conteneur :

sudo ./launcher enter app

Connectez-vous ensuite à la base de données :

sudo -u postgres psql discourse

Pour insérer un sujet :
insert into topics (title, user_id, archetype, fancy_title, category_id, created_at, updated_at, last_post_user_id, bumped_at) values ('psql test', 1, 'regular', 'psql test',8, NOW(), NOW(), 1, NOW());

Obtenez le nouvel ID, dans mon cas 886.

Insérez ensuite les publications :
insert into posts (user_id, topic_id, post_number, raw, cooked, created_at, updated_at, last_version_at) values (1,886,1,'this is the raw text','this is the cooked test',NOW(),NOW(),NOW());

Mettez ensuite à jour posts_count (si ce n’est pas déjà fait lors de l’insertion du sujet). Notez qu’il semble que le corps du sujet nécessite une publication initiale. Ci-dessous, le nombre de publications du sujet est mis à 1 :
update topics set posts_count=2 where id=886;

Probablement parce que vous êtes sur un compte différent ?

3 « J'aime »

Je vous recommande de trouver comment utiliser l’API. Beaucoup de magie est gérée par Rails. La probabilité que vous fassiez quelque chose qui rende votre base de données inutilisable est élevée.

5 « J'aime »

Mais voyez-vous quelque chose qui pourrait mal tourner si vous ajoutez simplement des sujets et des tables de publication et qu’ils sont correctement formés ?

C’est une très mauvaise idée.

Pourquoi pensez-vous que c’est plus facile que d’utiliser l’API ou d’exécuter des commandes Rails pour créer des publications ?

5 « J'aime »

Je n’étais pas au courant des commandes Rails pour créer des publications. Avez-vous plus de détails à ce sujet ?

Oui, les détails sont : Discourse est une application Rails !

1 « J'aime »

Je suis conscient que Discourse est une application Rails. Mais vous avez dit :

Donc, vous sous-entendez qu’il existe un autre moyen de générer des fils de discussion en émettant des « commandes rails », à moins que par commande rails vous ne vouliez dire créer manuellement des comptes et les taper dans l’interface web de Discourse ?

Il est de bonne pratique d’utiliser l’API, surtout si vous effectuez un appel depuis l’extérieur de l’application, car elle gère toute l’authentification et l’autorisation, ainsi que de nombreuses logiques métier que l’on ne peut pas toujours supposer.

2 « J'aime »

Eh bien, l’une des choses que je veux faire est de contourner toute autorisation et d’insérer le message dans la base de données sans qu’il ne soit bloqué parce qu’un utilisateur n’a pas la permission de poster dans une catégorie, ou que le sujet est trop court, ou qu’il n’y a pas assez d’entropie, etc. etc.

Ce serait bien s’il existait un appel API de type « superutilisateur » qui contourne toutes ces vérifications et crée simplement le message ou le sujet.

Par exemple, si vous souhaitez utiliser l’API pour créer un sujet sous un utilisateur qui n’a actuellement aucune permission de poster dans une certaine catégorie, vous pouvez utiliser le paramètre bypass_validations pour ce faire. Mais lorsque vous appelez ensuite l’API pour créer une réponse du même utilisateur, les vérifications de validation ne sont pas ignorées et la création du fil échoue. (il s’agit d’un bug signalé il y a 6 ans avec une pull request pour une correction qui n’a jamais été intégrée au code).

De plus, dans ce cas, contrairement à l’écriture directe dans la base de données, il n’y a pas de prise en charge des transactions pour annuler la création du fil d’origine et vous devez le retrouver manuellement pour le nettoyer et le corriger.

Pour l’instant, l’insertion des publications/sujets semble fonctionner correctement. J’étais un peu inquiet concernant la colonne ‘cooked’ car il n’était pas possible de la laisser vide, mais je la remplis actuellement avec le même texte que ‘raw’ et laisse ‘baked_at’ et ‘baked_version’ à NULL.

En visualisation, le processus de cuisson semble se déclencher assez rapidement lorsque la publication est consultée.

OK. J’ai trouvé un moyen de déclencher la recuisson :

rake posts:rebake

Utilisez les spécifications et importez des scripts comme guide pour manipuler les structures de données de discourse via des commandes ruby.

Utilisez la console rails pour les expériences.

3 « J'aime »

Il convient de noter que si votre client est écrit en Ruby, vous pouvez utiliser la gemme API Ruby :

1 « J'aime »

Si vous créez l’enregistrement avec Rails, il effectuera automatiquement le rebake lors de la sauvegarde du message, enverra des notifications et un tas d’autres choses.

Lorsque le message est créé avec un accès direct à la base de données, Discourse semble également le retraiter immédiatement.

1 « J'aime »