Bỏ qua, đến nội dung

Tham chiếu API — PostgreSQL Data Source

Tổng quan

Plugin plugin-data-source-external-postgres không tạo thêm API endpoint riêng mà tận dụng hệ thống resource API chuẩn của Digiforce. Khi bảng PostgreSQL được map thành collection, tất cả các thao tác CRUD đều hoạt động qua API giống như collection nội bộ.

Các thao tác CRUD được hỗ trợ

Thao tácPhương thức HTTPEndpointMô tả
listGET/api/<collection>:listLấy danh sách bản ghi có phân trang, filter, sort
getGET/api/<collection>:get?filterByTk=<id>Lấy một bản ghi theo primary key
createPOST/api/<collection>:createTạo bản ghi mới
updatePUT/api/<collection>:update?filterByTk=<id>Cập nhật bản ghi
destroyDELETE/api/<collection>:destroy?filterByTk=<id>Xóa bản ghi

Lưu ý

Primary key là bắt buộc để các thao tác get/update/destroy hoạt động. Bảng không có primary key chỉ hỗ trợ thao tác list.

Data Source API

Tạo data source qua API

typescript
await agent.resource('dataSources').create({
  values: {
    key: 'my-external-pg',
    type: 'postgres',
    displayName: 'PostgreSQL Production',
    options: {
      host: '192.168.1.100',
      port: 5432,
      database: 'my_erp',
      username: 'app_user',
      password: 'secret',
      schema: 'public',
    },
  },
});

Kiểm tra kết nối (Test Connection)

typescript
await agent.resource('dataSources').testConnection({
  values: {
    type: 'postgres',
    options: {
      host: '192.168.1.100',
      port: 5432,
      database: 'my_erp',
      username: 'app_user',
      password: 'secret',
    },
  },
});

Phương thức testConnection nội bộ thực hiện:

  1. Tạo kết nối Database tạm thời với dialect postgres
  2. Gọi sequelize.authenticate() để xác thực
  3. Nếu có chỉ định schema, truy vấn information_schema.schemata để kiểm tra
  4. Đóng kết nối và trả về kết quả

Làm mới schema (Refresh / Introspect lại)

typescript
await agent.resource('dataSources').refresh({
  filterByTk: 'my-external-pg',
});

Thao tác này kích hoạt DatabaseIntrospector quét lại cấu trúc bảng, cột, kiểu dữ liệu và primary key từ PostgreSQL.

Ánh xạ kiểu dữ liệu (Field Mapping)

Plugin tự động ánh xạ kiểu dữ liệu PostgreSQL sang field type của Digiforce thông qua fieldTypeMap['postgres']:

Kiểu PostgreSQLField Type DigiforceGhi chú
VARCHAR / TEXT / CHARstringChuỗi văn bản
INTEGER / SMALLINTintegerSố nguyên 32-bit
BIGINTbigIntSố nguyên 64-bit
REAL / FLOAT4floatSố thực dấu phẩy động
DOUBLE PRECISION / FLOAT8doubleSố thực độ chính xác kép
DECIMAL / NUMERICdecimalSố thập phân chính xác
BOOLEANbooleanGiá trị true/false
DATEdateChỉ ngày tháng
TIMESTAMP / TIMESTAMPTZdatetimeNgày giờ có/không có timezone
JSON / JSONBjsonDữ liệu JSON
ARRAYarrayMảng (hỗ trợ xác định element type)
UUIDuuidChuỗi UUID

Xử lý đặc biệt cho ARRAY

Plugin có logic riêng để xác định kiểu phần tử của cột ARRAY. Nó truy vấn information_schema.element_types để lấy element_type, sau đó ánh xạ sang field type tương ứng.

Xử lý Auto-Increment và UUID

Cột có defaultValue khớp với pattern nextval(...) hoặc uuid_generate_v4(...) sẽ được đánh dấu autoIncrement: true, nghĩa là Digiforce sẽ không yêu cầu nhập giá trị khi tạo bản ghi.

Filter và Sort

Plugin hỗ trợ đầy đủ các filter operator của Digiforce:

OperatorMô tảVí dụ
$eqBằng{ name: { $eq: 'Nguyễn Văn A' } }
$neKhác{ status: { $ne: 'deleted' } }
$gt / $gteLớn hơn / Lớn hơn hoặc bằng{ age: { $gt: 18 } }
$lt / $lteNhỏ hơn / Nhỏ hơn hoặc bằng{ price: { $lt: 1000000 } }
$likeChứa (LIKE){ name: { $like: '%keyword%' } }
$notLikeKhông chứa{ name: { $notLike: '%spam%' } }
$inTrong danh sách{ status: { $in: ['active', 'pending'] } }
$notInKhông trong danh sách{ role: { $notIn: ['banned'] } }
$nullGiá trị NULL{ email: { $null: true } }
$notNullKhông NULL{ phone: { $notNull: true } }

Unique Index và Constraint

Plugin truy vấn PostgreSQL system catalog (pg_indexes) để xác định các unique index trên bảng. Thông tin này được sử dụng để:

  • Đánh dấu trường có thuộc tính unique: true
  • Hỗ trợ kiểm tra trùng lặp khi tạo/cập nhật bản ghi

Giới hạn kỹ thuật

Giới hạnChi tiết
Bảng không có primary keyChỉ hỗ trợ đọc (list), không hỗ trợ get/update/destroy
Auto-incrementKhông thể ghi giá trị từ phía Digiforce cho cột auto-increment
Stored proceduresKhông hỗ trợ gọi stored procedure
ViewsHỗ trợ đọc (read-only), không thể ghi
Phân trang mặc định20 bản ghi/trang, thay đổi qua tham số pageSize
Cross-datasource relationKhông hỗ trợ quan hệ giữa bảng từ data source khác nhau