Escribiendo directamente a la base de datos

¿Alguien ha trabajado ya en leer/escribir directamente desde la base de datos? Al principio intenté usar la API para crear hilos y publicaciones, pero fue demasiado poco fiable, así que ahora estoy pensando en escribir directamente en la base de datos.

Los datos que quiero introducir son bastante sencillos: (título del hilo, autor, categoría, texto del cuerpo) y para las publicaciones (autor, texto del cuerpo).

Sin embargo, sospecho que también hay que completar varios campos adicionales y quizás realizar búsquedas en la base de datos de usuarios.

Empezaré desde cero, así que busco ver si alguien lo ha hecho antes o tiene alguna indicación sobre las estructuras de las tablas o cualquier cosa a tener en cuenta.

olvidé que también necesito agregar la fecha/hora a cada una (no puedo editar mi publicación original para actualizarla).

¿Podrías compartir los problemas que encontraste?

2 Me gusta

Puedes ver mis otras publicaciones. Fueron sobre:

  • Problemas de límite de tasa
  • Problemas de validación
  • La omisión de validación no funciona de manera consistente para hilos frente a temas

Al final, pensé que sería más fácil ir directamente a la base de datos.

En lugar de horas de frustración tratando de lidiar con las sutilezas de la API, en pocos minutos logré que algo funcionara y, con suerte, fuera más eficiente:

Para aquellos que quieran hacer lo mismo, notas de mi exploración hasta ahora:

Primero ingresa al contenedor:

sudo ./launcher enter app

Luego conéctate a la base de datos:

sudo -u postgres psql discourse

Para insertar un tema:
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());

Obtén el nuevo id, en mi caso 886.

Luego inserta las publicaciones:
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());

Luego actualiza posts_count (si no se hizo ya en la inserción del tema). Nota que parece que el cuerpo del tema necesita una publicación inicial. A continuación se cambia el número de publicaciones del tema a 1:
update topics set posts_count=2 where id=886;

¿Probablemente porque estás en una cuenta diferente?

3 Me gusta

Te recomiendo que averigües cómo usar la API. Muchas cosas mágicas son manejadas por Rails. La probabilidad de que hagas algo que deje tu base de datos inutilizable es alta.

5 Me gusta

Pero, ¿ves algo que pueda salir mal si solo estás agregando a las tablas de temas y publicaciones y estas están correctamente formadas?

Esta es una idea terrible.

¿Por qué crees que esto es más fácil que usar la API o ejecutar comandos de Rails para crear publicaciones?

5 Me gusta

No tenía conocimiento de comandos de Rails para crear publicaciones. ¿Tienes más detalles sobre esto?

Sí, los detalles son: ¡Discourse es una aplicación de Rails!

1 me gusta

Soy consciente de que Discourse es una aplicación de Rails. Pero dijiste:

Entonces, ¿implica que hay otra forma de generar hilos emitiendo ‘comandos de rails’ a menos que por comando de rails te refieras a crear manualmente cuentas y escribirlas en la interfaz web de Discourse?

Es una buena práctica utilizar la API, especialmente si se realiza una llamada desde fuera de la aplicación, ya que se encarga de toda la autenticación y autorización, así como de gran parte de la lógica de negocio que no siempre se puede asumir.

2 Me gusta

Bueno, una de las cosas que quiero hacer es omitir toda la autorización y meter la publicación en la base de datos sin que se bloquee porque un usuario no tiene permiso para publicar en una categoría, o el tema es demasiado corto, o no hay suficiente entropía, etc., etc.

Sería bueno si hubiera una llamada a la API de ‘superusuario’ que omitiera todas estas comprobaciones y simplemente creara la publicación o el tema.

Por ejemplo, si desea utilizar la API para crear un tema bajo un usuario que actualmente no tiene permiso para publicar en una categoría determinada, puede utilizar el parámetro bypass_validations para hacerlo. Pero cuando luego llama a la API para crear una respuesta del mismo usuario, las comprobaciones de validación no se omiten y la creación del hilo falla. (este es un error que se informó hace 6 años con una solicitud de extracción para una solución que nunca llegó a la base de código).

Además, en este caso, a diferencia de escribir directamente en la base de datos, no hay soporte para transacciones para revertir la creación del hilo original y debe encontrarlo manualmente para limpiarlo y arreglarlo.

Por ahora, solo insertar las publicaciones/temas parece funcionar bien. Me preocupaba un poco la columna ‘cooked’, ya que no era posible tenerla nula, pero por ahora la estoy rellenando con el mismo texto que ‘raw’ y dejando ‘baked_at’ y ‘baked_version’ como NULL.

En la vista, el proceso de horneado parece activarse bastante rápido cuando se ve la publicación.

OK. Encontré una forma de activar el rebake:

rake posts:rebake

Utilice las especificaciones y los scripts de importación como guía para manipular las estructuras de datos de Discourse a través de comandos de Ruby.

Utilice la consola de Rails para realizar experimentos.

3 Me gusta

Vale la pena señalar que si tu cliente está escrito en Ruby, puedes usar la gema de la API de Ruby:

1 me gusta

Si creas el registro con Rails, hará el rebake automáticamente cuando se guarde la publicación, además de enviar notificaciones y un montón de cosas más.

Cuando la publicación se crea con acceso directo a la base de datos, Discourse también parece volver a hornearla inmediatamente.

1 me gusta