هذا الأمر إدمان للغاية. استنادًا إلى منشور المدونة “نماذج اللغة الكبيرة (LLMs) وـ SQL”، وقليلاً من التجربة والخطأ، قمت بإنشاء هذا الأمر (prompt) الذي يحتوي على وصف جزئي لقاعدة بيانات Discourse:
أمر قاعدة بيانات Discourse
النص الموجود بين تعليقات /* Discourse database documentation start */ و /* Discourse database documentation end */ يحتوي على تفاصيل حول قاعدة بيانات PostgreSQL لتطبيق منتدى Discourse.
تمت صياغة جميع الجداول والأعمدة في عبارات `CREATE TABLE`. انتبه إلى استعلامات العينات التي تلي كل عبارة من عبارات `CREATE TABLE`. تحتوي التعليقات المضمنة (`-- --`) وتعليقات الأسطر المتعددة (`/* */`) على بعض التفاصيل المهمة الإضافية. بعد إرسال هذه المعلومات إليك، سأطلب منك كتابة بعض الاستعلامات التي سيتم تشغيلها بواسطة إضافة Discourse Data Explorer. جميع الجداول والأعمدة
المطلوبة لكتابة هذه الاستعلامات موجودة في عبارات `CREATE TABLE` التي أرسلتها لك.
/* Discourse database documentation start */
CREATE TABLE users (
id integer NOT NULL, -- المفهوم في التطبيق هو وجود مستخدمين "حقيقيين". المستخدم "الحقيقي" هو المستخدم الذي يكون معرّفه (id) أكبر من 0 --
username character varying(60) NOT NULL,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
name character varying,
seen_notification_id integer DEFAULT 0 NOT NULL,
last_posted_at timestamp without time zone,
password_hash character varying(64),
salt character varying(32),
active boolean DEFAULT false NOT NULL,
username_lower character varying(60) NOT NULL,
last_seen_at timestamp without time zone,
admin boolean DEFAULT false NOT NULL,
last_emailed_at timestamp without time zone,
trust_level integer NOT NULL,
approved boolean DEFAULT false NOT NULL,
approved_by_id integer,
approved_at timestamp without time zone,
previous_visit_at timestamp without time zone,
suspended_at timestamp without time zone,
suspended_till timestamp without time zone,
date_of_birth date,
views integer DEFAULT 0 NOT NULL,
flag_level integer DEFAULT 0 NOT NULL,
ip_address inet,
moderator boolean DEFAULT false,
title character varying,
uploaded_avatar_id integer,
locale character varying(10),
primary_group_id integer,
registration_ip_address inet,
staged boolean DEFAULT false NOT NULL,
first_seen_at timestamp without time zone,
silenced_till timestamp without time zone,
group_locked_trust_level integer,
manual_locked_trust_level integer,
secure_identifier character varying,
flair_group_id integer,
last_seen_reviewable_id integer
);
SELECT * FROM users WHERE id = 1 OR id = 2 OR id = 121;
id | username | created_at | updated_at | name | seen_notification_id | last_posted_at | password_hash | salt | active | username_lower | last_seen_at | admin | last_emailed_at | trust_level | approved | approved_by_id | approved_at | previous_visit_at | suspended_at | suspended_till | date_of_birth | views | flag_level | ip_address | moderator | title | uploaded_avatar_id | locale | primary_group_id | registration_ip_address | staged | first_seen_at | silenced_till | group_locked_trust_level | manual_locked_trust_level | secure_identifier | flair_group_id | last_seen_reviewable_id | password_algorithm
-----+----------+----------------------------+----------------------------+--------------+----------------------+----------------------------+------------------------------------------------------------------+----------------------------------+--------+----------------+----------------------------+-------+----------------------------+-------------+----------+----------------+----------------------------+----------------------------+----------------------------+-------------------------+---------------+-------+------------+------------+-----------+------------+--------------------+--------+------------------+-------------------------+--------+----------------------------+---------------+--------------------------+---------------------------+------------------------------------------+----------------+-------------------------+------------------------------
1 | scossar | 2019-04-26 22:59:44.685893 | 2023-08-14 04:40:20.823438 | Simon Cossar | 56395 | 2023-08-14 04:08:43.430717 | 9547d42a1dc5759a0c22ed2c97c490dac845ed76ebc4a412f885ceb908965794 | 304898f78b8b732b1d64011c0d086e91 | t | scossar | 2023-08-14 04:40:56.769353 | t | 2023-08-14 04:33:46.44485 | 3 | t | -1 | 2020-09-22 19:54:41.05418 | 2023-08-13 22:35:00.020816 | | | 1904-02-14 | 0 | 0 | ::1 | t | Member | 747 | | | | f | 2019-04-26 23:10:43.250255 | | | 3 | | | 432 | $pbkdf2-sha256$i=64000,l=32$
2 | sally | 2019-04-26 23:15:47.859691 | 2023-08-14 04:40:56.831344 | | 56396 | 2023-08-14 04:11:37.417456 | e1f0be57f784827602613c35ebd4b4087f858c715ebea1b3027f8c520bffbdf9 | ff59f100b4bdd43524f94e3a2f808106 | t | sally | 2023-08-14 04:33:57.054779 | f | 2023-08-14 04:33:06.727322 | 2 | t | -1 | 2020-05-19 19:35:15.79381 | 2023-08-13 22:08:05.099486 | | | | 0 | 0 | 127.0.0.1 | t | Regular | 22 | en | 49 | 127.0.0.1 | f | 2019-04-26 23:16:58.912958 | | | | a292161dd2ebbedbcd0e79f96baca06d9f399083 | 194 | 432 | $pbkdf2-sha256$i=64000,l=32$
121 | Ben | 2019-11-15 16:31:38.216013 | 2023-08-14 04:40:41.907605 | | 56314 | 2023-07-07 20:48:33.496471 | 364180ae133b9b8bb560d30a41b9854f96e069ef2f7f95d957d2dc7122752074 | b6b40fd3b4e2e1236cef027c222f73bc | t | ben | 2023-08-14 04:39:47.42192 | f | 2023-08-14 04:30:26.764459 | 2 | t | 1 | 2019-11-15 16:31:38.089553 | 2023-07-22 02:14:01.540478 | 2022-05-05 17:39:02.632952 | 2022-05-06 17:38:55.054 | | 0 | 0 | 127.0.0.1 | f | Prime Four | | en | 196 | 127.0.0.1 | f | 2019-11-15 16:31:38.714185 | | | | | 196 | | $pbkdf2-sha256$i=64000,l=32$
CREATE TABLE groups (
id integer NOT NULL,
name character varying NOT NULL,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
automatic boolean DEFAULT false NOT NULL,
user_count integer DEFAULT 0 NOT NULL,
automatic_membership_email_domains text,
primary_group boolean DEFAULT false NOT NULL,
title character varying,
grant_trust_level integer,
incoming_email character varying,
has_messages boolean DEFAULT false NOT NULL,
flair_url character varying,
flair_bg_color character varying,
flair_color character varying,
bio_raw text,
bio_cooked text,
allow_membership_requests boolean DEFAULT false NOT NULL,
full_name character varying,
default_notification_level integer DEFAULT 3 NOT NULL,
visibility_level integer DEFAULT 0 NOT NULL,
public_exit boolean DEFAULT false NOT NULL,
public_admission boolean DEFAULT false NOT NULL,
membership_request_template text,
messageable_level integer DEFAULT 0,
mentionable_level integer DEFAULT 0,
members_visibility_level integer DEFAULT 0 NOT NULL,
publish_read_state boolean DEFAULT false NOT NULL,
flair_icon character varying,
flair_upload_id integer,
smtp_server character varying,
smtp_port integer,
smtp_ssl boolean,
imap_server character varying,
imap_port integer,
imap_ssl boolean,
imap_mailbox_name character varying DEFAULT ''::character varying NOT NULL,
imap_uid_validity integer DEFAULT 0 NOT NULL,
imap_last_uid integer DEFAULT 0 NOT NULL,
email_username character varying,
email_password character varying,
imap_last_error text,
imap_old_emails integer,
imap_new_emails integer,
allow_unknown_sender_topic_replies boolean DEFAULT false NOT NULL,
smtp_enabled boolean DEFAULT false,
smtp_updated_at timestamp without time zone,
smtp_updated_by_id integer,
imap_enabled boolean DEFAULT false,
imap_updated_at timestamp without time zone,
imap_updated_by_id integer,
assignable_level integer DEFAULT 0 NOT NULL,
email_from_alias character varying
); -- يتم إضافة المستخدمين الذين لديهم حالة "admin" أو "moderator" إلى مجموعة "staff" التلقائية --
SELECT * FROM groups WHERE id = 1 OR id = 11 OR id = 49;
id | name | created_at | updated_at | automatic | user_count | automatic_membership_email_domains | primary_group | title | grant_trust_level | incoming_email | has_messages | flair_bg_color | flair_color | bio_raw | bio_cooked | allow_membership_requests | full_name | default_notification_level | visibility_level | public_exit | public_admission | membership_request_template | messageable_level | mentionable_level | members_visibility_level | publish_read_state | flair_icon | flair_upload_id | smtp_server | smtp_port | smtp_ssl | imap_server | imap_port | imap_ssl | imap_mailbox_name | imap_uid_validity | imap_last_uid | email_username | email_password | imap_last_error | imap_old_emails | imap_new_emails | allow_unknown_sender_topic_replies | smtp_enabled | smtp_updated_at | smtp_updated_by_id | imap_enabled | imap_updated_at | imap_updated_by_id | assignable_level | email_from_alias
----+---------------+----------------------------+----------------------------+-----------+------------+------------------------------------+---------------+------------+-------------------+----------------+--------------+----------------+-------------+--------------------+---------------------------+---------------------------+---------------------------+----------------------------+------------------+-------------+------------------+-----------------------------+-------------------+-------------------+--------------------------+--------------------+------------+-----------------+-------------+-----------+----------+-------------+-----------+----------+-------------------+-------------------+---------------+----------------+----------------+-----------------+-----------------+-----------------+------------------------------------+--------------+---------------------------+--------------------+--------------+-----------------+--------------------+------------------+------------------
1 | admins | 2019-04-26 22:58:35.997964 | 2021-08-05 19:11:22.699825 | t | 1 | | f | | | | t | | | | | f | | 3 | 1 | f | f | | 99 | 0 | 0 | f | | | | | | | | | | 0 | 0 | | | | | | f | f | | | f | | | 0 |
11 | trust_level_1 | 2019-04-26 22:58:36.033238 | 2021-10-05 19:54:51.043121 | t | 116 | | f | | | | t | | | | | f | | 3 | 1 | f | f | | 0 | 0 | 0 | f | | | | | | | | | | 0 | 0 | | | | | | f | f | | | f | | | 0 |
49 | eurorack | 2019-10-03 17:28:42.323203 | 2022-08-16 19:54:09.223307 | f | 84 | example.com | t | Euroracker | 3 | | t | | | All about eurorack+| <p>All about eurorack</p> | f | Eurorack Enthusiasts Club | 3 | 0 | f | t | Can I join this group? | 99 | 99 | 0 | t | | | | | | | | | | 0 | 0 | | | | | | f | f | 2022-02-11 23:24:28.76631 | 1 | f | | | 0 |
/* group_users يربط بين جداول groups و users */
CREATE TABLE group_users (
id integer NOT NULL,
group_id integer NOT NULL,
user_id integer NOT NULL,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
owner boolean DEFAULT false NOT NULL,
notification_level integer DEFAULT 2 NOT NULL,
first_unread_pm_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
);
SELECT * FROM group_users WHERE id = 13 OR id = 8219 OR id = 9137;
id | group_id | user_id | created_at | updated_at | owner | notification_level | first_unread_pm_at
------+----------+---------+----------------------------+----------------------------+-------+--------------------+----------------------------
13 | 3 | 1 | 2019-04-26 22:59:47.828533 | 2019-04-26 22:59:47.828533 | f | 2 | 2023-08-14 01:14:54.229593
8219 | 13 | 121 | 2022-04-21 08:15:47.946036 | 2022-04-21 08:15:47.946036 | f | 2 | 2023-07-05 06:49:04.48265
9137 | 49 | 2 | 2022-09-08 17:34:39.290504 | 2022-09-08 17:34:39.290504 | t | 3 | 2020-11-21 02:40:15.868728
CREATE TABLE posts (
id integer NOT NULL,
user_id integer,
topic_id integer NOT NULL,
post_number integer NOT NULL,
raw text NOT NULL,
cooked text NOT NULL,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
reply_to_post_number integer,
reply_count integer DEFAULT 0 NOT NULL,
quote_count integer DEFAULT 0 NOT NULL,
deleted_at timestamp without time zone, -- التطبيق يقوم فقط بـ "الحذف الناعم" للمشاركات والمواضيع. ما لم يُطلب صراحةً إرجاع تفاصيل حول المشاركات أو المواضيع المحذوفة، تأكد دائمًا من أن `deleted_at IS NULL` عند كتابة الاستعلامات المتعلقة بالمشاركات أو المواضيع. --
off_topic_count integer DEFAULT 0 NOT NULL,
like_count integer DEFAULT 0 NOT NULL,
incoming_link_count integer DEFAULT 0 NOT NULL,
bookmark_count integer DEFAULT 0 NOT NULL,
score double precision,
reads integer DEFAULT 0 NOT NULL,
post_type integer DEFAULT 1 NOT NULL, -- :regular=>1, :moderator_action=>2, :small_action=>3, :whisper=>4 --
sort_order integer,
last_editor_id integer,
hidden boolean DEFAULT false NOT NULL,
hidden_reason_id integer,
notify_moderators_count integer DEFAULT 0 NOT NULL,
spam_count integer DEFAULT 0 NOT NULL,
illegal_count integer DEFAULT 0 NOT NULL,
inappropriate_count integer DEFAULT 0 NOT NULL,
last_version_at timestamp without time zone NOT NULL,
user_deleted boolean DEFAULT false NOT NULL,
reply_to_user_id integer,
percent_rank double precision DEFAULT 1.0,
notify_user_count integer DEFAULT 0 NOT NULL,
like_score integer DEFAULT 0 NOT NULL,
deleted_by_id integer,
edit_reason character varying,
word_count integer,
version integer DEFAULT 1 NOT NULL,
cook_method integer DEFAULT 1 NOT NULL,
wiki boolean DEFAULT false NOT NULL,
baked_at timestamp without time zone,
baked_version integer,
hidden_at timestamp without time zone,
self_edits integer DEFAULT 0 NOT NULL,
reply_quoted boolean DEFAULT false NOT NULL,
via_email boolean DEFAULT false NOT NULL,
raw_email text,
public_version integer DEFAULT 1 NOT NULL,
action_code character varying,
locked_by_id integer,
image_upload_id bigint
);
SELECT * FROM posts WHERE id = 11094 OR id = 11095 OR id = 11096;
id | user_id | topic_id | post_number | raw | cooked | created_at | updated_at | reply_to_post_number | reply_count | quote_count | deleted_at | off_topic_count | like_count | incoming_link_count | bookmark_count | score | reads | post_type | sort_order | last_editor_id | hidden | hidden_reason_id | notify_moderators_count | spam_count | illegal_count | inappropriate_count | last_version_at | user_deleted | reply_to_user_id | percent_rank | notify_user_count | like_score | deleted_by_id | edit_reason | word_count | version | cook_method | wiki | baked_at | baked_version | hidden_at | self_edits | reply_quoted | via_email | raw_email | public_version | action_code | locked_by_id | image_upload_id | outbound_message_id
-------+---------+----------+-------------+----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+----------------------------+----------------------+-------------+-------------+------------+-----------------+------------+---------------------+----------------+-------+-------+-----------+------------+----------------+--------+------------------+-------------------------+------------+---------------+---------------------+----------------------------+--------------+------------------+-------------------+-------------------+------------+---------------+-------------+------------+---------+-------------+------+----------------------------+---------------+-----------+------------+--------------+-----------+-----------+----------------+-------------+--------------+-----------------+--------------------------------
11094 | 1 | 1852 | 7 | This is an example of a Discourse post. | <p>This is an example of a Discourse post.</p> | 2023-08-14 04:08:43.430717 | 2023-08-14 04:08:43.430717 | | 0 | 0 | | 0 | 0 | 0 | 0 | 0.2 | 1 | 1 | 7 | 1 | f | | 0 | 0 | 0 | 0 | 2023-08-14 04:08:43.441371 | f | | 0.166666666666667 | 0 | 0 | | | 8 | 1 | 1 | f | 2023-08-14 04:08:43.430685 | 2 | | 0 | f | f | | 1 | | | |
11095 | 2 | 10863 | 11 | This is another example of a Discourse post. | <p>This is another example of a Discourse post.</p> | 2023-08-14 04:11:37.417456 | 2023-08-14 04:11:37.417456 | 5 | 0 | 0 | | 0 | 0 | 0 | 0 | 0.4 | 2 | 1 | 11 | 2 | f | | 0 | 0 | 0 | 0 | 2023-08-14 04:11:37.430459 | f | 121 | 0.8 | 0 | 0 | | | 8 | 1 | 1 | f | 2023-08-14 04:11:37.417417 | 2 | | 0 | f | f | | 1 | | | | discourse/post/11095@127.0.0.1
11096 | 121 | 11047 | 2 | Thanks! I hadn't seen that :slight_smile: | <p>Thanks! I hadn’t seen that <img src="//127.0.0.1:4200/images/emoji/twitter/slight_smile.png?v=12" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> | 2023-08-14 0[details="مستند قاعدة بيانات Discourse"]
4:13:09.346146 | 2023-08-14 05:17:10.659726 | | 0 | 0 | | 0 | 0 | 0 | 0 | 0.4 | 2 | 1 | 2 | 1 | f | | 0 | 0 | 0 | 0 | 2023-08-14 05:17:10.589855 | f | | 0 | 0 | 0 | | | 7 | 2 | 1 | f | 2023-08-14 05:17:10.659607 | 2 | | 0 | f | f | | 2 | | | | discourse/post/11096@127.0.0.1
CREATE TABLE topics (
id integer NOT NULL,
title character varying NOT NULL,
last_posted_at timestamp without time zone,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
views integer DEFAULT 0 NOT NULL,
posts_count integer DEFAULT 0 NOT NULL,
user_id integer, -- معرف المستخدم: معرف المستخدم الذي أنشأ الموضوع --
last_post_user_id integer NOT NULL,
reply_count integer DEFAULT 0 NOT NULL,
featured_user1_id integer,
featured_user2_id integer,
featured_user3_id integer,
deleted_at timestamp without time zone, -- تقوم التطبيق بحذف "ناعم" للمشاركات والمواضيع فقط. ما لم يُطلب صراحةً إرجاع تفاصيل حول المشاركات أو المواضيع المحذوفة، تحقق دائماً من أن `deleted_at IS NULL` عند كتابة الاستعلامات المتعلقة بالمشاركات أو المواضيع. --
highest_post_number integer DEFAULT 0 NOT NULL,
like_count integer DEFAULT 0 NOT NULL,
incoming_link_count integer DEFAULT 0 NOT NULL,
category_id integer,
visible boolean DEFAULT true NOT NULL,
moderator_posts_count integer DEFAULT 0 NOT NULL,
closed boolean DEFAULT false NOT NULL,
archived boolean DEFAULT false NOT NULL,
bumped_at timestamp without time zone NOT NULL,
has_summary boolean DEFAULT false NOT NULL,
archetype character varying DEFAULT 'regular'::character varying NOT NULL, -- يمكن تعيين archetype إما إلى 'regular' أو 'private_message' --
featured_user4_id integer,
notify_moderators_count integer DEFAULT 0 NOT NULL,
spam_count integer DEFAULT 0 NOT NULL,
pinned_at timestamp without time zone,
score double precision,
percent_rank double precision DEFAULT 1.0 NOT NULL,
subtype character varying,
slug character varying,
deleted_by_id integer,
participant_count integer DEFAULT 1,
word_count integer,
excerpt character varying,
pinned_globally boolean DEFAULT false NOT NULL,
pinned_until timestamp without time zone,
fancy_title character varying,
highest_staff_post_number integer DEFAULT 0 NOT NULL,
featured_link character varying,
reviewable_score double precision DEFAULT 0.0 NOT NULL,
image_upload_id bigint,
slow_mode_seconds integer DEFAULT 0 NOT NULL,
bannered_until timestamp without time zone,
external_id character varying,
CONSTRAINT has_category_id CHECK (((category_id IS NOT NULL) OR ((archetype)::text <> 'regular'::text))),
CONSTRAINT pm_has_no_category CHECK (((category_id IS NULL) OR ((archetype)::text <> 'private_message'::text)))
);
SELECT * FROM topics WHERE id = 1852 OR id = 10863 OR id = 11047;
id | title | last_posted_at | created_at | updated_at | views | posts_count | user_id | last_post_user_id | reply_count | featured_user1_id | featured_user2_id | featured_user3_id | deleted_at | highest_post_number | like_count | incoming_link_count | category_id | visible | moderator_posts_count | closed | archived | bumped_at | has_summary | archetype | featured_user4_id | notify_moderators_count | spam_count | pinned_at | score | percent_rank | subtype | slug | deleted_by_id | participant_count | word_count | excerpt | pinned_globally | pinned_until | fancy_title | highest_staff_post_number | featured_link | reviewable_score | image_upload_id | slow_mode_seconds | bannered_until | external_id
-------+-------------------------------------+----------------------------+----------------------------+----------------------------+-------+-------------+---------+-------------------+-------------+-------------------+-------------------+-------------------+------------+---------------------+------------+---------------------+-------------+---------+-----------------------+--------+----------+----------------------------+-------------+-----------------+-------------------+-------------------------+------------+-----------+-------------------+--------------+--------------+-------------------------------------+---------------+-------------------+------------+-----------------------------------------------------------------------------------+-----------------+--------------+-------------------------------------+---------------------------+---------------+------------------+-----------------+-------------------+----------------+-------------
1852 | Ask Me Anything | 2023-08-14 04:08:43.430717 | 2020-05-04 22:11:50.813596 | 2023-08-14 05:25:00.249902 | 2 | 3 | 1 | 1 | 0 | | | | | 7 | 0 | 2 | 3 | t | 4 | f | f | 2023-08-14 04:08:43.430717 | f | regular | | 0 | 0 | | 0.914285714285714 | 1 | | ask-me-anything | | 1 | 157 | The AMA with @sally will be held on May 8th. Start sending in your questions now. | f | | Ask Me Anything | 7 | | 0 | | 0 | |
10863 | Post the last picture on your phone | 2023-08-14 04:11:37.417456 | 2022-01-25 21:42:52.514124 | 2023-08-14 05:22:30.373683 | 18 | 5 | 2 | 2 | 3 | 121 | 1 | | | 11 | 4 | 7 | 14 | t | 0 | f | f | 2023-08-14 04:11:37.417456 | f | regular | | 0 | 0 | | 6.54545454545455 | 1 | | post-the-last-picture-on-your-phone | | 3 | 150 | This is a test. This should go to the review queue | f | | Post the last picture on your phone | 11 | | 70.75 | 445 | 0 | |
11047 | Have you seen this post? | 2023-08-14 04:13:09.346146 | 2022-05-12 22:26:39.280698 | 2023-08-14 05:16:41.106722 | 3 | 2 | 1 | 121 | 0 | | | | | 2 | 0 | 0 | | t | 0 | f | f | 2023-08-14 05:17:10.695009 | f | private_message | | 0 | 0 | | 0.4 | 1 | user_to_user | have-you-seen-this-post | | 2 | 11 | Here is another one… | f | | Have you seen this post? | 2 | | 0 | | 0 | |
CREATE TABLE categories (
id integer NOT NULL,
name character varying(50) NOT NULL,
color character varying(6) DEFAULT '0088CC'::character varying NOT NULL,
topic_id integer,
topic_count integer DEFAULT 0 NOT NULL,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
user_id integer NOT NULL,
topics_year integer DEFAULT 0,
topics_month integer DEFAULT 0,
topics_week integer DEFAULT 0,
slug character varying NOT NULL,
description text,
text_color character varying(6) DEFAULT 'FFFFFF'::character varying NOT NULL,
read_restricted boolean DEFAULT false NOT NULL,
auto_close_hours double precision,
post_count integer DEFAULT 0 NOT NULL,
latest_post_id integer,
latest_topic_id integer,
"position" integer,
parent_category_id integer,
posts_year integer DEFAULT 0,
posts_month integer DEFAULT 0,
posts_week integer DEFAULT 0,
email_in character varying,
email_in_allow_strangers boolean DEFAULT false,
topics_day integer DEFAULT 0,
posts_day integer DEFAULT 0,
allow_badges boolean DEFAULT true NOT NULL,
name_lower character varying(50) NOT NULL,
auto_close_based_on_last_post boolean DEFAULT false,
topic_template text,
contains_messages boolean,
sort_order character varying,
sort_ascending boolean,
uploaded_logo_id integer,
uploaded_background_id integer,
topic_featured_link_allowed boolean DEFAULT true,
all_topics_wiki boolean DEFAULT false NOT NULL,
show_subcategory_list boolean DEFAULT false,
num_featured_topics integer DEFAULT 3,
default_view character varying(50),
subcategory_list_style character varying(50) DEFAULT 'rows_with_featured_topics'::character varying,
default_top_period character varying(20) DEFAULT 'all'::character varying,
mailinglist_mirror boolean DEFAULT false NOT NULL,
minimum_required_tags integer DEFAULT 0 NOT NULL,
navigate_to_first_post_after_read boolean DEFAULT false NOT NULL,
search_priority integer DEFAULT 0,
allow_global_tags boolean DEFAULT false NOT NULL,
reviewable_by_group_id integer,
read_only_banner character varying,
default_list_filter character varying(20) DEFAULT 'all'::character varying,
allow_unlimited_owner_edits_on_first_post boolean DEFAULT false NOT NULL,
default_slow_mode_seconds integer
);
SELECT * FROM categories WHERE id = 3 OR id = 16 OR id = 42;
id | name | color | topic_id | topic_count | created_at | updated_at | user_id | topics_year | topics_month | topics_week | slug | description | text_color | read_restricted | auto_close_hours | post_count | latest_post_id | latest_topic_id | position | parent_category_id | posts_year | posts_month | posts_week | email_in | email_in_allow_strangers | topics_day | posts_day | allow_badges | name_lower | auto_close_based_on_last_post | topic_template | contains_messages | sort_order | sort_ascending | uploaded_logo_id | uploaded_background_id | topic_featured_link_allowed | all_topics_wiki | show_subcategory_list | num_featured_topics | default_view | subcategory_list_style | default_top_period | mailinglist_mirror | minimum_required_tags | navigate_to_first_post_after_read | search_priority | allow_global_tags | reviewable_by_group_id | read_only_banner | default_list_filter | allow_unlimited_owner_edits_on_first_post | default_slow_mode_seconds | uploaded_logo_dark_id
----+------------------+--------+----------+-------------+----------------------------+----------------------------+---------+-------------+--------------+-------------+------------------+-------------------------------------------------------------------------------------------+------------+-----------------+------------------+------------+----------------+-----------------+----------+--------------------+------------+-------------+------------+----------+--------------------------+------------+-----------+--------------+------------------+-------------------------------+----------------+-------------------+------------+----------------+------------------+------------------------+-----------------------------+-----------------+-----------------------+---------------------+--------------+---------------------------+--------------------+--------------------+-----------------------+-----------------------------------+-----------------+-------------------+------------------------+------------------+---------------------+-------------------------------------------+---------------------------+-----------------------
3 | Staff | E45735 | 2 | 16 | 2019-04-26 22:58:38.813759 | 2023-02-16 08:35:51.424024 | -1 | 0 | 0 | 0 | staff | Private category for staff discussions. Topics are only visible to admins and moderators. | FFFFFF | t | | 23 | 11094 | 11250 | 41 | | 1 | 0 | 0 | | f | 0 | 0 | t | staff | f | | | | | | | t | f | f | 3 | | rows_with_featured_topics | all | f | 0 | f | 0 | f | | | all | f | |
16 | customer support | F7941D | 277 | 13 | 2019-07-17 20:18:13.584715 | 2023-08-11 20:50:35.548498 | 1 | 1 | 0 | 0 | customer-support | This description will appear on the categories page. | FFFFFF | f | 720 | 68 | 11087 | 11236 | 0 | | 10 | 7 | 0 | | f | 0 | 0 | f | customer support | f | | | | | 689 | | t | f | f | 4 | | rows_with_featured_topics | all | f | 0 | f | 0 | f | | | all | f | |
42 | eurorack | 0088CC | 584 | 30 | 2019-10-03 17:29:33.782372 | 2023-08-13 21:35:09.514998 | 1 | 1 | 0 | 0 | eurorack | All about Eurorack synths. | FFFFFF | f | | 142 | 11091 | 11183 | 1 | | 15 | 3 | 3 | | f | 0 | 3 | t | eurorack | f | | | posts | | | | t | f | f | 4 | latest | rows_with_featured_topics | all | f | 2 | t | 0 | f | | | all | f | |
CREATE TABLE tags (
id integer NOT NULL,
name character varying NOT NULL,
topic_count integer DEFAULT 0 NOT NULL,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
pm_topic_count integer DEFAULT 0 NOT NULL,
target_tag_id integer,
description character varying
);
SELECT * FROM tags WHERE id = 183 OR id = 184 OR id = 185;
id | name | created_at | updated_at | pm_topic_count | target_tag_id | description | public_topic_count | staff_topic_count
-----+-------------+----------------------------+----------------------------+----------------+---------------+-------------+--------------------+-------------------
183 | photos | 2023-08-14 05:22:30.326838 | 2023-08-14 05:22:30.326838 | 0 | | | 1 | 1
184 | meetup | 2023-08-14 05:25:00.227547 | 2023-08-14 05:25:00.227547 | 0 | | | 0 | 1
185 | icebreakers | 2023-08-14 06:18:39.214459 | 2023-08-14 06:18:39.214459 | 0 | | | 1 | 1
CREATE TABLE topic_tags (
id integer NOT NULL,
topic_id integer NOT NULL,
tag_id integer NOT NULL,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL
);
SELECT * FROM topic_tags WHERE id = 1005 OR id = 1006 OR id = 1007;
id | topic_id | tag_id | created_at | updated_at
------+----------+--------+----------------------------+----------------------------
1005 | 10863 | 183 | 2023-08-14 05:22:30.360668 | 2023-08-14 05:22:30.360668
1006 | 1852 | 184 | 2023-08-14 05:25:00.237298 | 2023-08-14 05:25:00.237298
1007 | 10863 | 185 | 2023-08-14 06:18:39.240753 | 2023-08-14 06:18:39.240753
CREATE TABLE user_actions (
id integer NOT NULL,
action_type integer NOT NULL, -- :like=>1 (عندما يعجب مستخدم بمشروع)، :was_liked=>2 (عندما يُعجب بمشروع مستخدم)، :new_topic=>4، :reply=>5، :response=>6، :mention=>7، :quote=>9، :edit=>11، :new_private_message=>12، :got_private_message=>13، :solved=>15، :assigned=>16 --
user_id integer NOT NULL,
target_topic_id integer,
target_post_id integer,
target_user_id integer,
acting_user_id integer,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL
);
SELECT * FROM user_actions WHERE id = 19928 OR id = 19929 OR id = 19931;
/*
في المثال الأول أدناه، أعجب المستخدم ذو المعرف 1 (action_type: 1) بالمشاركة ذات المعرف 11100. نظراً لأن المستخدم ذو المعرف 1 قام بالإجراء، تم تعيين 1 كقيمة لعمود acting_user_id. نظراً لأن السجل يسجل أن هذا المستخدم قام بإجراء "إعجاب"، تم أيضاً تعيين معرف مستخدمه (1) في عمود user_id الخاص بالسجل.
إليك مثال لاستعلام سيعيد عدد المرات التي أعجب فيها المستخدم ذو المعرف: 1 بمشاركات المستخدمين الآخرين: `SELECT COUNT(user_id) AS number_of_likes_given FROM user_actions WHERE action_type = 1 AND user_id = 1;`
في المثال الثاني أدناه، تم الإعجاب بمشروع المستخدم ذو المعرف 121 (المعرف 11100) من قبل مستخدم آخر (action_type: 2). تم تعيين user_id الخاص بالسجل إلى 121 لأن هذا هو المعرف للمستخدم الذي تم الإعجاب بمشاركته. تم تعيين عمود acting_user_id الخاص بالسجل إلى 1 لأن هذا هو المستخدم الذي أعجب بالمشاركة.
إليك مثال لاستعلام يعيد عدد المرات التي تم فيها الإعجاب بمشاركات المستخدم ذو المعرف 121 من قبل مستخدمين آخرين: `SELECT COUNT(user_id) AS number_of_likes_received FROM user_actions WHERE action_type = 2 AND user_id = 121;`
إليك مثال لاستعلام يعيد عدد المرات التي تم فيها الإعجاب بمشاركات المستخدم ذو المعرف 121 من قبل المستخدم ذو المعرف: 1: `SELECT COUNT(user_id) AS number_of_likes_received_from_user_1 FROM user_actions WHERE action_type = 2 AND user_id = 121 AND acting_user_id = 1;`
في المثال الثالث، تم ذكر المستخدم ذو المعرف 121 (action_type: 7) في المشاركة (المعرف 11101) من قبل المستخدم ذو المعرف 2. تم تعيين user_id الخاص بالسجل إلى 121 لأن هذا هو المعرف للمستخدم الذي تم ذكره. تم تعيين acting_user_id الخاص بالسجل إلى 2 لأن هذا هو المعرف للمستخدم الذي أنشأ الذكر.
إليك مثال يعيد عدد المرات التي تم فيها ذكر المستخدم ذو المعرف 121 من قبل أي مستخدمين: `SELECT COUNT(user_id) AS number_of_mentions_received FROM user_actions WHERE action_type = 7 AND user_id = 121;`
إليك مثال لاستعلام يعيد عدد المرات التي تم فيها ذكر المستخدم ذو المعرف 121 من قبل المستخدم ذو المعرف 2: `SELECT COUNT(user_id) AS number_of_mentions_received_from_user_2 FROM user_actions WHERE action_type = 7 AND user_id = 121 AND acting_user_id = 2;`
إليك مثال لاستعلام يعيد عدد المرات التي تم فيها ذكر المستخدم ذو المعرف 121 في الموضوع ذو المعرف 7282: `SELECT COUNT(user_id) AS number_of_mentions_received_in_topic FROM user_actions WHERE action_type = 7 AND user_id = 121 AND target_topic_id = 7282;`
*/
id | action_type | user_id | target_topic_id | target_post_id | target_user_id | acting_user_id | created_at | updated_at
-------+-------------+---------+-----------------+----------------+----------------+----------------+----------------------------+----------------------------
19928 | 1 | 1 | 7282 | 11100 | | 1 | 2023-08-14 07:47:49.520171 | 2023-08-14 07:47:49.651056
19929 | 2 | 121 | 7282 | 11100 | | 1 | 2023-08-14 07:47:49.520171 | 2023-08-14 07:47:49.671757
19931 | 7 | 121 | 7282 | 11101 | | 2 | 2023-08-14 08:00:05.877537 | 2023-08-14 08:00:05.877537
CREATE TABLE polls (
id bigint NOT NULL,
post_id bigint,
name character varying DEFAULT 'poll'::character varying NOT NULL,
close_at timestamp without time zone,
type integer DEFAULT 0 NOT NULL,
status integer DEFAULT 0 NOT NULL,
results integer DEFAULT 0 NOT NULL,
visibility integer DEFAULT 0 NOT NULL,
min integer,
max integer,
step integer,
anonymous_voters integer,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
chart_type integer DEFAULT 0 NOT NULL, -- {"bar"=>0, "pie"=>1} --
groups character varying,
title character varying
);
SELECT * FROM polls WHERE id = 71 OR id = 72 OR id = 74;
id | post_id | name | close_at | type | status | results | visibility | min | max | step | anonymous_voters | created_at | updated_at | chart_type | groups | title
----+---------+------+---------------------+------+--------+---------+------------+-----+-----+------+------------------+----------------------------+----------------------------+------------+---------------+-------------------------------------------
71 | 11097 | poll | 2023-08-20 07:00:00 | 0 | 0 | 0 | 1 | | | | | 2023-08-14 06:38:10.96388 | 2023-08-14 06:38:10.96388 | 0 | trust_level_2 | Who took the best picture?
72 | 11098 | poll | 2023-09-10 07:00:00 | 0 | 0 | 0 | 1 | | | | | 2023-08-14 06:40:36.925762 | 2023-08-14 06:40:36.925762 | 1 | staff | Who should we invite to our next AMA?
74 | 11100 | poll | 2023-08-27 07:00:00 | 1 | 0 | 0 | 0 | 1 | 2 | | | 2023-08-14 06:48:27.498764 | 2023-08-14 06:48:27.498764 | 0 | eurorack | What are your favourite Eurorack modules?
CREATE TABLE poll_options (
id bigint NOT NULL,
poll_id bigint,
digest character varying NOT NULL,
html text NOT NULL,
anonymous_votes integer,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL
);
SELECT * FROM poll_options WHERE id = 271 OR id = 274 OR id = 280;
id | poll_id | digest | html | anonymous_votes | created_at | updated_at
-----+---------+----------------------------------+----------------+-----------------+----------------------------+----------------------------
271 | 71 | 5c6c2c880d86e5a0d9f0924a7ffd9629 | Sally | | 2023-08-14 06:38:10.975263 | 2023-08-14 06:38:10.975263
274 | 72 | 2654933188fb6bd444b6df4cc39fd908 | Dangerous Dave | | 2023-08-14 06:40:36.930354 | 2023-08-14 06:40:36.930354
280 | 74 | f2e5462d97476629719e607dc80a9619 | Maths | | 2023-08-14 06:48:27.502673 | 2023-08-14 06:48:27.502673
CREATE TABLE poll_votes (
poll_id bigint,
poll_option_id bigint,
user_id bigint,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL
);
SELECT * FROM poll_votes WHERE poll_id = 71;
poll_id | poll_option_id | user_id | created_at | updated_at
---------+----------------+---------+----------------------------+----------------------------
71 | 270 | 2 | 2023-08-14 06:59:00.382873 | 2023-08-14 06:59:00.382873
71 | 271 | 121 | 2023-08-14 07:02:57.364892 | 2023-08-14 07:02:57.364892
71 | 271 | 1 | 2023-08-14 07:03:36.464304 | 2023-08-14 07:03:36.464304
/* نهاية توثيق قاعدة بيانات Discourse */
يتناول هذا المستند جداول users وgroups وgroup_users وposts وtopics وcategories وtags وtopic_tags وuser_actions وpolls وpoll_options وpoll_votes. يبلغ حجمه حالياً 1150 رمزاً (token)، لذا يجب أن يكون قادراً على مضاعفة حجمه دون التسبب في مشاكل. لاحظ أنه إذا قمت بنسخه إلى إدخال محادثة ChatGPT، فستحتاج إلى لصقه في مدخلين منفصلين - حد الأحرف في إدخال المحادثة أقل من حد الرموز (tokens) لجلسة المحادثة.
أضفت تعليقات مفصلة إلى حد ما فوق استعلامات user_actions المثال. مع هذه الأمثلة، يقوم ChatGPT بعمل جيد في الإجابة على الأسئلة المتعلقة بالإعجابات المقدمة والإعجابات المستلمة وما إلى ذلك. كان يصارع مع ذلك سابقاً. أشتبه في أن هناك بعض الجداول التي ستحتاج إلى نهج مماثل.
بعد إرسال التوثيق، تكون المطالبات (prompts) التالية مفيدة:
أمثلة على المطالبات
عندما أطلب منك بدء استعلام بـ “CTE فترة الاستعلام”، أريد أن يبدأ الاستعلام بهذا SQL بالضبط (بما في ذلك التعليق):
--[params]
-- string :query_interval = 1 week
-- date :start_date
-- date :end_date
WITH query_periods AS (
SELECT
generate_series(:start_date, :end_date, :query_interval::interval)::date AS period_start,
(generate_series(:start_date, :end_date, :query_interval::interval)::date + :query_interval::interval - INTERVAL '1 DAY')::date AS period_end
)
يسمح ملحق Data Explorer بإضافة معلمات إلى استعلاماته. يجب أن تظهر المعلمات المستخدمة في الاستعلامات في تعليق في أعلى الاستعلام بهذا الشكل:
--[params]
--param_type :param_name
أنواع المعلمات المتاحة هي:
intوbigintوbooleanوstringوdateوtimeوdatetimeوdoubleوuser_idوpost_idوtopic_idوcategory_idوgroup_idوbadge_idوint_listوstring_listوuser_list
إليك مثال:
--[params]
-- string :action_type
يمكن توفير قيمة افتراضية اختيارية لمعلمة. على سبيل المثال:
--[params]
--string :action_type = like
لقد أنشأت مطالبة “CTE فترة الاستعلام” لأنني إذا لم أخبر ChatGPT بشكل محدد كيفية إنشاء CTE فترة الاستعلام، كان يأتي بأنواع مختلفة من الحلول، بعضها أفضل من الآخر. مع المطالبة، يضيف الكود الدقيق الذي أعطيه له، ثم يبني استعلامات فوقه دون أي مشاكل. بشكل مثير للاهتمام، عندما حاولت إضافة تفاصيل حول كيفية إنشاء “CTE فترة الاستعلام” إلى التوثيق الأولي الذي أرسلته إلى ChatGPT، كان يتجاهل التعليمات فقط. لسبب ما، إرسالها كمطالبة منفصلة يحدث فرقاً.
المطالبات التي تصف كيفية “الحذف الناعم” للمواضيع والمشاركات في Discourse مفيدة أيضاً. بعد إطلاع ChatGPT على الحاجة إلى التحقق من أن deleted_at IS NOT NULL للاستعلامات المتعلقة بالمواضيع والمشاركات، يطبق ذلك بشكل متسق على جميع الاستعلامات.
إخبار ChatGPT بعدم وضع الفاصلة المنقوطة في نهاية الاستعلامات أمر مستحيل تقريباً. يتذكر ذلك لعدد قليل من الاستعلامات، ثم يعود إلى إضافة الفاصلة المنقوطة. يبدو أن هذا تفصيلة ثانوية.
كانت أملي الأولي في الحصول على استعلام مثالي من سؤال باللغة الطبيعية طموحاً بعض الشيء. يرتكب أخطاء، وأنا أيضاً. على الأقل على المدى القصير، أعتقد أن أفضل طريقة لدمج ChatGPT مع ملحق Data Explorer هي بدء رسالة خاصة مع ChatGPT. يمكن إرسال وصف أساسي لقاعدة البيانات عند إنشاء الرسالة الخاصة. ثم يمكن جعل مجموعة من المطالبات متاحة عبر واجهة المستخدم. على سبيل المثال، مطالبة لتوسيط استعلام، أو مطالبة لإضافة تفاصيل حول جدول نادراً ما يُستخدم.
أشتبه في أن هذا يمكن أن يكون مفيداً جداً لشخص يعرف القليل من SQL، ولكن ربما يمكن تنفيذه بطريقة تساعد الأشخاص الجدد على SQL على الوصول إلى المستوى المطلوب بشكل أسرع بكثير مما لو فعلوا ذلك بمفردهم. تعلمت هذا الحيلة الرائعة اليوم:
WITH post_type_mapping AS (
SELECT 'regular' AS type, 1 AS post_type
UNION ALL
SELECT 'moderator_action' AS type, 2 AS post_type
UNION ALL
SELECT 'small_action' AS type, 3 AS post_type
UNION ALL
SELECT 'whisper' AS type, 4 AS post_type
)
...
JOIN post_type_mapping m ON :post_type = m.type
WHERE p.post_type = m.post_type