Supabase hỏi đáp cùng các kiến thức liên quan với postgresql, postgrest

 

1: Kế thừa chính sách rls của view từ rls của bảng cơ sở như thế nào

2: Với ĐK Supabase + PostgreSql >15

ALTER VIEW <VIEW_NAME> SET (security_invoker = on);


create view <VIEW_NAME>

with(security_invoker = true)

as select <QUERY>



1: Supabase join và lọc theo bảng đã được join và bảng gốc

2: Ví dụ bảng endpoint_nac có mac, port, trong đó port link đến bảng device_port.

await _supabase.schema('btth').from('device_port')

        .select('*,endpoint:endpoint_nac!inner!port(mac)') // inner because filter mac

        //.select('*,endpoint:endpoint_nac!left!port(port,mac)') // default is left join

        .eq('device_sn', serial_number) // lọc  theo bảng gốc

        .eq('endpoint.mac', '11-22-33-44-55-66') // (*) lọc theo bảng được join

Lưu ý: khi sử dụng left join => điều kiện (*) ở trên biến thành tìm endpoint_nac hoặc null hoặc endpoint_nac có mac = '11-22-33-44-55-66'. Supbase kế thừa từ "postgrest" nên phải nắm rõ postgrest trước khi sử dụng supabase (https://docs.postgrest.org/en/v12/references/api/resource_embedding.html)

Do đó để tránh nhầm lẫn,, khi lọc giá trị theo bảng được JOIN, bạn nên sử dụng !inner

Đôi khi người ta viết các hàm để thay thế và sử dụng supabase.rpc



1: PostgreSQL - One-To-One

2:

create table technical_specs(

  film_id int references films(id) unique,

  runtime time,

  camera text,

  sound text

);

create table films(

  id int primary key generated always as identity, -- is unique

  title text,

  year int,

  rating numeric(3,1),

  language text

);


1: Find all publications

2: https://maurus.ttu.ee/design_queries/query.php?query_id=732

SELECT pubname AS publication_name,

puballtables AS is_all_tables,

pubinsert AS is_insert,

pubupdate AS is_update,

pubdelete AS is_delete,

pubtruncate AS is_truncate,

string_agg(n.nspname || '.' || c.relname, ',<br>' ORDER BY n.nspname, c.relname) AS published_tables,

CASE WHEN Count(pr.oid)=0 AND puballtables=TRUE THEN

(SELECT Count(*) AS c

FROM INFORMATION_SCHEMA.tables

WHERE table_type='BASE TABLE'

AND table_schema NOT IN (SELECT schema_name

FROM INFORMATION_SCHEMA.schemata

WHERE schema_name<>'public' AND

schema_owner='postgres' AND schema_name IS NOT NULL))

ELSE Count(pr.oid)

END AS number_of_published_tables

FROM pg_publication AS p LEFT JOIN pg_publication_rel AS pr

ON p.oid=pr.prpubid

LEFT JOIN pg_class AS c ON c.oid=pr.prrelid

LEFT JOIN pg_namespace AS n ON c.relnamespace=n.oid

GROUP BY pubname, puballtables, pubinsert, pubupdate, pubdelete, pubtruncate

ORDER BY pubname;


1. supabase/postgrest: Bảng dữ liệu unit, chuyển kiểu dữ liệu ltree của column "path" sang text với cột mới "path_text"

2. supabase.from('unit').select('path_text')

create function path_text(unit) returns text as $$

        select $1.path::text;

$$ language sql;

Cách này có thể sử dụng để truy vấn các lệnh join khi chưa khai báo "foreign key relationship"



Nhận xét