مفتاح مستكشف البيانات المكرر يمنع إعادة البناء

مرحبًا بالجميع،

من النادر أن أطلب المساعدة، لكنني محير بشأن كيفية حل هذه المشكلة.

أعدت بناء موقعي للتو وحصلت على هذا:

discourse-data-explorer is already at latest compatible version

I, [2020-08-28T17:53:57.578920 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
2020-08-28 17:54:07.380 UTC [3060] discourse@discourse ERROR:  duplicate key value violates unique constraint "data_explorer_queries_pkey"
2020-08-28 17:54:07.380 UTC [3060] discourse@discourse DETAIL:  Key (id)=(-7) already exists.
2020-08-28 17:54:07.380 UTC [3060] discourse@discourse STATEMENT:  INSERT INTO data_explorer_queries(id, name, description, sql, user_id, last_run_at, hidden, created_at, updated_at)
        SELECT
          (replace(key, 'q:',''))::integer,
          value::json->>'name',
          value::json->>'description',
          value::json->>'sql',
          CASE WHEN (value::json->'created_by')::text = 'null' THEN
            null
          WHEN (value::json->'created_by')::text = '""' THEN
            null
          WHEN (value::jsonb ? 'created_by') THEN
            (value::json->>'created_by')::integer
          ELSE
            null
          END,
          CASE WHEN (value::json->'last_run_at')::text = 'null' THEN
            null
          WHEN (value::json->'last_run_at')::text = '""' THEN
            null
          ELSE
            (value::json->'last_run_at')::text::timestamptz
          END,
          CASE WHEN (value::json->'hidden')::text = 'null' THEN
            false
          WHEN (value::jsonb ? 'hidden') THEN
            (value::json->'hidden')::text::boolean
          ELSE
            false
          END,
          '2020-08-28 17:54:07.368132',
          '2020-08-28 17:54:07.368132'
        FROM plugin_store_rows
        WHERE plugin_name = 'discourse-data-explorer' AND type_name = 'JSON' AND (replace(key, 'q:',''))::integer < 0

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

ERROR:  duplicate key value violates unique constraint "data_explorer_queries_pkey"

الجزء المهم هو ERROR: duplicate key value violates unique constraint "data_explorer_queries_pkey"

لقد وجدت الاستعلام بمعرف -7 في وحدة تحكم Rails، لكنه يبدو أحد الاستعلامات المدمجة.

[5] pry(main)> DataExplorer::Query.find(-7)
=> #<DataExplorer::Query:0x000055e44bbb4038
 @created_by="-1",
 @description="based on post score calculated using reply count, likes, incoming links, bookmarks, time spent and read count.",
 @group_ids=[],
 @hidden=nil,
 @id=-7,
 @last_run_at="2020-01-03T18:06:31.966+00:00",
 @name="Top 50 Quality Users",
 @sql=
  "SELECT sum(p.score) / count(p) AS \"average score per post\",\n    count(p.id) AS post_count,\n    p.user_id\nFROM posts p\nJOIN users u ON u.id = p.user_id\nWHERE p.created_at >= CURRENT_DATE - INTERVAL '6 month'\nAND NOT u.admin\nAND u.active\nGROUP BY user_id,\n    u.views\nHAVING count(p.id) > 50\nORDER BY sum(p.score) / count(p) DESC\nLIMIT 50">

كما دخلت إلى موجه PL/SQL لكنني غير متأكد - هل يجب علي إزالة استعلام مدمج للسماح بإدراج استعلام جديد؟

إعجابَين (2)

انضم إلى psql، ثم شغّل:

     SELECT
          (replace(key, 'q:',''))::integer,
          value::json->>'name',
          value::json->>'description',
          value::json->>'sql',
          CASE WHEN (value::json->'created_by')::text = 'null' THEN
            null
          WHEN (value::json->'created_by')::text = '""' THEN
            null
          WHEN (value::jsonb ? 'created_by') THEN
            (value::json->>'created_by')::integer
          ELSE
            null
          END,
          CASE WHEN (value::json->'last_run_at')::text = 'null' THEN
            null
          WHEN (value::json->'last_run_at')::text = '""' THEN
            null
          ELSE
            (value::json->'last_run_at')::text::timestamptz
          END,
          CASE WHEN (value::json->'hidden')::text = 'null' THEN
            false
          WHEN (value::jsonb ? 'hidden') THEN
            (value::json->'hidden')::text::boolean
          ELSE
            false
          END,
          '2020-08-28 17:54:07.368132',
          '2020-08-28 17:54:07.368132'
        FROM plugin_store_rows
        WHERE plugin_name = 'discourse-data-explorer' AND type_name = 'JSON' AND (replace(key, 'q:',''))::integer < 0;
4 إعجابات

هذا يعيد صفين يبدوان متطابقين. “أفضل 50 مستخدمًا من حيث الجودة”

وغريبًا، إذا قمت بـ:

[3] pry(main)> PluginStoreRow.where(plugin_name: 'discourse-data-explorer', key: "q:-7")
=> [#<PluginStoreRow:0x000055e280408bf8
  id: 1286,
  plugin_name: "discourse-data-explorer",
  key: "q:-7",
  type_name: "JSON",
  value:
   "{\"id\":-7,\"name\":\"أفضل 50 مستخدمًا من حيث الجودة\",\"description\":\"بناءً على درجة المنشور المحسوبة باستخدام عدد الردود، والإعجابات، والروابط الواردة، والإشارات المرجعية، والوقت المستغرق، وعدد مرات القراءة.\",\"sql\":\"SELECT sum(p.score) / count(p) AS \\\"متوسط الدرجة لكل منشور\\\",\\n    count(p.id) AS post_count,\\n    p.user_id\\nFROM posts p\\nJOIN users u ON u.id = p.user_id\\nWHERE p.created_at \\u003e= CURRENT_DATE - INTERVAL '6 month'\\nAND NOT u.admin\\nAND u.active\\nGROUP BY user_id,\\n    u.views\\nHAVING count(p.id)
 \\u003e 50\\nORDER BY sum(p.score) / count(p) DESC\\nLIMIT 50\\n\",\"created_by\":\"-1\",\"created_at\":null,\"group_ids\":[],\"last_run_at\":\"2020-01-03T18:06:31.966+00:00\"}">]

يبدو أن لدي صفًا واحدًا فقط بمعرف -7؟

إعجابَين (2)

حسناً، إذا قمت بتبسيط هذا إلى:

select * from plugin_store_rows WHERE plugin_name = 'discourse-data-explorer' AND type_name = 'JSON' AND (replace(key, 'q:',''))::integer < 0;

فإنه يعيد صفين متطابقين (باستثناء ‘id’).

أعتقد أنني يجب أن أكون شجاعاً وأحذف أحدهما!

ملاحظة: تم الأمر، قمت بحذف السجل الأحدث - إعادة البناء

(استخدمت DELETE from plugin_store_rows WHERE id = $$$معرف السجل المكرر$$$;)

الانتقال نجح الآن!

شكراً لدفعك @Falco

8 إعجابات

هذا هو السبب الكامل وراء انتقالنا إلى جداول مخصصة لمنع تكرار مثل هذه الحالات في المستقبل. للأسف، حصلت عليها قبلنا :winking_face_with_tongue:

6 إعجابات

شكرًا لك على الإصلاح المفصل. واجهت نفس المشكلة (معرفان مكرران id)، وقد نجح الحل.

إعجابَين (2)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.