データベースに直接書き込む

データベースへの直接読み書きを行ったことがある方はいらっしゃいますか? 最初はAPIを使ってスレッドや投稿を作成しようとしましたが、信頼性が低かったため、現在はデータベースに直接書き込むことを検討しています。

入力したいデータは非常にシンプルです。(スレッドタイトル、著者、カテゴリ、本文)と(投稿者、本文)です。

しかし、さまざまな追加フィールドも入力する必要があり、ユーザーデータベースへのルックアップも必要になるのではないかと疑っています。

ゼロから始めるので、以前に作業したことがある方や、テーブル構造や注意点について何かヒントをいただけると幸いです。

投稿を編集できないため、各投稿に日時を追加する必要があることも忘れていました。

発生した問題について共有していただけますか?

「いいね!」 2

他の投稿も参照してください。それらは以下に関するものでした。

  • レート制限の問題
  • 検証の問題
  • スレッドとトピックで検証バイパスが常に機能しない

結局、データベースに直接アクセスする方が簡単だと考えました。

API の気まぐれに対処するのに何時間も費やす代わりに、数分で動作し、おそらくよりパフォーマンスの高いものを機能させることができました。

同様のことをしたい人のために、これまでの調査からのメモを以下に示します。

まずコンテナに入ります。

sudo ./launcher enter app

次にデータベースに接続します。

sudo -u postgres psql discourse

トピックを挿入するには:
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());

新しいIDを取得します。私の場合は 886 です。

次に投稿を挿入します。

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());

次に posts_count を更新します(トピック挿入時にまだ行われていない場合)。トピックの本文には初期投稿が必要なようです。以下は、トピックの投稿数を 1 に変更します。

update topics set posts_count=2 where id=886;

別のアカウントを使用しているため、おそらくそうでしょう。

「いいね!」 3

APIの使い方を理解することをお勧めします。多くのマジックはRailsによって処理されます。データベースが使用不能になるようなことをする可能性は高いです。

「いいね!」 5

しかし、トピックと投稿テーブルに正しくフォーマットされたものを追加するだけで、何か問題が発生する可能性はあるでしょうか?

これはひどいアイデアです。

APIを使用したり、投稿を作成するためにRailsコマンドを実行したりするよりも、なぜこれが簡単だと思うのですか?

「いいね!」 5

投稿を作成するためのRailsコマンドがあるとは知りませんでした。これについてさらに詳しい情報を教えていただけますか?

はい、詳細は以下の通りです。DiscourseはRailsアプリです!

「いいね!」 1

DiscourseがRailsアプリであることは承知しています。しかし、あなたはこう言いました。

これは、「railsコマンド」とは、手動でアカウントを作成してDiscourseのWebフロントエンドに入力すること以外に、投稿を生成する別の方法があることを示唆していますか?

APIを呼び出すことは、特にアプリ外から呼び出す場合には良い習慣です。なぜなら、認証や認可、そして常に想定できるとは限らない多くのビジネスロジックをすべて処理してくれるからです。

「いいね!」 2

さて、私がやりたいことの1つは、すべての認可をバイパスして、ユーザーがカテゴリに投稿する権限がない、トピックが短すぎる、エントロピーが足りないなどの理由でエラーにならないように、投稿をデータベースに直接書き込むことです。

すべてのチェックをバイパスして、投稿やトピックをそのまま作成する「スーパーユーザー」API呼び出しがあれば便利です。

たとえば、現在特定のカテゴリに投稿する権限がないユーザーの下にトピックを作成するためにAPIを使用したい場合、bypass_validations パラメータを使用してこれを行うことができます。しかし、その後、同じユーザーによって返信を作成するためにAPIを呼び出すと、検証チェックはスキップされず、スレッドの作成は失敗します。(これは6年前に報告されたバグで、プルリクエストで修正が提案されましたが、コードベースには取り込まれませんでした)。

また、この場合、データベースへの直接書き込みとは異なり、トランザクションをロールバックして元のスレッドの作成を取り消すサポートがないため、手動で検索してクリーンアップし、修正する必要があります。

今のところ、投稿/トピックを挿入するだけでうまくいっているようです。「cooked」列はNULLにできなかったので少し心配でしたが、今は「raw」と同じテキストで埋め、baked_atとbaked_versionはNULLのままにしています。

表示上は、投稿が表示されるとすぐにベイク処理がトリガーされるようです。

わかりました。リベイクをトリガーする方法を見つけました。

rake posts:rebake

仕様とインポートスクリプトをガイドとして、Rubyコマンドでディスコースデータ構造を操作します。

実験にはRailsコンソールを使用してください。

「いいね!」 3

Rubyでクライアントを記述している場合は、Ruby API gemを使用できることを指摘する価値があります。

「いいね!」 1

Railsでレコードを作成すると、投稿が保存される際に自動的にリベイクが行われ、通知やその他の多くの処理も実行されます。

データベースに直接アクセスして投稿を作成すると、Discourse はすぐに再ベイク処理も行うようです。

「いいね!」 1