Chuyển đến nội dung
Trang chủ IntoSQL

Chuyển PostgreSQL sang SQLite

Thả bản dump dạng plain từ pg_dump hoặc pg_dumpall, dạng .sql hoặc .sql.gz, và tải xuống tập lệnh SQLite với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi giá trị SQLite không chứa được nguyên trạng, và mọi đối tượng nó không hỗ trợ, đều được liệt kê trong báo cáo.

Tệp của bạn
sqlshop_2024_postgres.sqlTệp mẫu, 6,2 kB
Cơ sở dữ liệu của bạn

Đã chuyển đổi 18 hàng, 3 bản sửa, không hàng nào bị từ chối

Hiển thị

Các bảng trong shop_2024_postgres.sqlBản dump PostgreSQL 18.6 · do pg_dump ghi · utf8mb4

  • customers8 hàng2
    8 cột
    idINTEGER not null
    nameTEXT not null
    emailTEXT not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    tagsTEXT not null
    signed_upDATE
    created_atTIMESTAMP not null
  • orders10 hàng1
    10 cột
    idINTEGER not null
    customer_idINTEGER not null
    statusTEXT not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteTEXT
    detailsTEXT
    deliveryTEXT

Không được chuyển đổi

  • Khung nhìn paid_orders

Mỗi cơ sở dữ liệu viết các đối tượng này bằng ngôn ngữ riêng. Hãy viết lại chúng cho SQLite.

-- Written by IntoSQL from a PostgreSQL dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

CREATE TABLE customers ( -- People who bought at least once
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT NOT NULL,
    country VARCHAR(2) DEFAULT 'US' NOT NULL,
    is_active INTEGER DEFAULT 1 NOT NULL,
    tags TEXT NOT NULL,
    signed_up DATE,
    created_at TIMESTAMP DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now')) NOT NULL,
    CONSTRAINT customers_is_active_check CHECK (is_active IN (0, 1))
);

CREATE TABLE orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER NOT NULL,
    status TEXT DEFAULT 'pending' NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    items INTEGER DEFAULT 1 NOT NULL,
    ordered_at DATETIME NOT NULL,
    shipped_at DATETIME,
    note TEXT,
    details TEXT,
    delivery TEXT,
    CONSTRAINT orders_status_check CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled')),
    CONSTRAINT orders_orders_total_check CHECK (total >= (0)),
    CONSTRAINT orders_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers (id)
);

INSERT INTO customers (id, name, email, country, is_active, tags, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'["vip"]','2023-01-15','2023-01-15 10:24:00'),
(2,'Zoë Müller','zoe@example.de','DE',1,'[]','2023-02-03','2023-02-03 08:11:42'),
(3,'José Peña','jose@example.es','ES',0,'["wholesale","late payer"]','2023-03-21','2023-03-21 19:05:17'),
(4,'李雷','lilei@example.cn','CN',1,'[]','2023-05-09','2023-05-09 02:40:00'),
(5,'Noah O''Brien','noah@example.ie','IE',1,'[]',NULL,'2023-06-30 14:00:00'),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'["vip"]','2024-01-02','2024-01-02 09:30:00'),
(7,'Ravi Patel','ravi@example.in','IN',0,'[]','2024-02-29','2024-02-29 23:59:59'),
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'[]','2024-04-12','2024-04-12 12:12:12');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, delivery) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'{"gift": false}','1 day 06:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}',NULL),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind',NULL,NULL),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','{"fragile": true}','2 days 05:50:00'),
(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice',NULL,NULL),
(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','{"fragile": true}','20:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,NULL,NULL),
(8,2,'shipped',19.99,1,'2024-03-12 08:00:00',NULL,'Shipped date set to infinity by an old import',NULL,NULL),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00','2024-03-15 10:00:00','Two parcels','{"parcels": [1, 2]}','18:30:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf',NULL,NULL);

-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_customers_email_key ON customers (email);
CREATE INDEX orders_idx_orders_customer ON orders (customer_id);
CREATE INDEX orders_idx_orders_status_date ON orders (status, ordered_at);
UPDATE sqlite_sequence SET seq = max(seq, 1000) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 1000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 5000) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 5000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
COMMIT;

-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;

Bản sửa

  1. "created_at" của customers chứa thời điểm kèm múi giờ; SQLite không có kiểu giữ được múi giờ, nên chúng được lưu theo UTC dưới dạng TIMESTAMP.
  2. "tags" của customers là text[], kiểu SQLite không có, nên là TEXT với cùng giá trị.
  3. "delivery" của orders là interval, kiểu SQLite không có, nên là TEXT với cùng giá trị.

Cần xem lại

  • 1 khung nhìn, trình kích hoạt, thủ tục hoặc sự kiện không được chuyển đổi; báo cáo liệt kê từng mục. Hãy tạo lại chúng thủ công trong SQLite.
  • Giá trị mặc định của "tags" trong customers không viết được cho SQLite (a value its type can't hold), nên cột không có giá trị mặc định. Hãy thêm giá trị mặc định thủ công nếu hàng mới cần nó.
  • Chỉ mục idx_orders_details trên orders dùng một biểu thức không viết được cho SQLite (a gin index), nên không được tạo. Hãy tạo chỉ mục thủ công nếu truy vấn cần nó.
  • 1 giá trị trong "shipped_at" của orders là ngày mà SQLite không lưu được, như infinity, nên chúng là NULL. SQLite lưu năm từ 1 đến 9999, không có vô cực; hãy thay các ngày đó trong nguồn nếu chúng quan trọng.

Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.

Mẫu khác:

Những gì thay đổi từ PostgreSQL sang SQLite

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

  • boolean

    INTEGER 0 hoặc 1 kèm CHECK

    SQLite không có kiểu boolean; true và false của nó là 1 và 0.

  • varchar(n), char(n), text

    VARCHAR(n) và TEXT, không áp dụng độ dài

    SQLite giữ kiểu đã khai báo cho công cụ đọc nhưng không giới hạn độ dài.

  • numeric(p,s) past 15 digits and numeric without a precision

    TEXT

    SQLite giữ khoảng 15 chữ số có nghĩa trong một số. Số rộng hơn được giữ dạng văn bản để mọi chữ số vẫn chính xác.

    Dòng báo cáo: decimal_as_text

  • money

    NUMERIC

    SQLite không có kiểu tiền tệ. Số tiền được giữ dạng số, không kèm ký hiệu tiền tệ mà locale của máy chủ đã thêm.

    Dòng báo cáo: type_replaced

  • interval

    TEXT với văn bản của PostgreSQL

    SQLite không có kiểu interval; văn bản giữ mọi phần.

    Dòng báo cáo: type_replaced

  • arrays (integer[], text[]...)

    TEXT chứa mảng JSON

    SQLite không có mảng. Mảng JSON giữ mọi phần tử và NULL, và các hàm JSON của SQLite đọc được nó.

    Dòng báo cáo: type_replaced

  • ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types

    TEXT với văn bản của PostgreSQL

    SQLite không có kiểu tương đương, nên mỗi giá trị giữ văn bản PostgreSQL đã ghi.

    Dòng báo cáo: type_replaced

  • json, jsonb

    TEXT

    Các hàm JSON của SQLite đọc JSON từ văn bản.

  • timestamp

    DATETIME dạng văn bản ISO 8601

    SQLite lưu ngày dạng văn bản mà các hàm ngày của nó đọc được.

  • timestamp with time zone

    TIMESTAMP dạng văn bản ISO 8601 theo UTC

    SQLite không có kiểu giữ được độ lệch, nên mỗi thời điểm được ghi theo UTC: cùng một thời điểm dù bản dump ghi độ lệch nào.

    Dòng báo cáo: moments_as_utc

  • time

    TIME dạng văn bản

    SQLite giữ giờ dạng văn bản, kể cả 24:00:00.

  • infinity, -infinity and BC dates

    NULL

    Các hàm ngày của SQLite đọc năm từ 0 đến 9999, không có vô cực. Các giá trị đó trở thành NULL và báo cáo đếm số lượng.

    Dòng báo cáo: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    SQLite lưu NaN là NULL và vô cực của nó không giữ được qua mọi công cụ, nên các giá trị đó trở thành NULL và báo cáo đếm số lượng.

    Dòng báo cáo: invalid_value_null

  • NOT NULL columns with values that become NULL

    bỏ NOT NULL

    Cột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.

    Dòng báo cáo: not_null_relaxed

  • enum types

    TEXT kèm CHECK các nhãn

    Văn bản kèm ràng buộc kiểm tra giữ đúng các giá trị.

  • enum columns holding values outside their labels

    TEXT không có ràng buộc kiểm tra

    Giá trị không có trong các nhãn sẽ vi phạm ràng buộc kiểm tra, nên ràng buộc không được tạo.

    Dòng báo cáo: enum_check_skipped

  • uuid, inet, cidr, macaddr

    TEXT

    SQLite không có các kiểu như vậy; văn bản giữ mọi giá trị.

  • bytea

    BLOB

    Byte vẫn là byte.

  • bit(n), bit varying

    INTEGER với giá trị của các bit đến 63 bit; dài hơn là chữ số TEXT

    Chuỗi bit được lưu là số do các bit tạo thành khi còn vừa số nguyên có dấu.

  • oid, xid, cid

    INTEGER kèm CHECK không âm

    Số nguyên 64 bit của SQLite chứa được mọi giá trị.

  • citext and nondeterministic collations

    so sánh chính xác

    SQLite so sánh văn bản chính xác, trừ khi được chỉ định khác, và NOCASE của nó chỉ bỏ qua hoa thường với chữ ASCII.

    Dòng báo cáo: case_insensitive_collation

  • serial, identity

    INTEGER PRIMARY KEY AUTOINCREMENT, tiếp tục sau id lớn nhất

    SQLite đếm một khóa chính là toàn bộ một số nguyên, và AUTOINCREMENT giữ cho id không bị dùng lại, như sequence.

  • serial and identity columns that aren't the whole primary key

    INTEGER không có bộ đếm

    SQLite chỉ đếm cột là toàn bộ khóa chính, nên cột giữ giá trị và hàng mới cần tự có giá trị.

    Dòng báo cáo: counter_dropped

  • sequences not owned by a column

    không được tạo

    SQLite không có sequence.

    Dòng báo cáo: sequence_not_converted

  • generated columns

    GENERATED ALWAYS AS, STORED hoặc VIRTUAL như trong nguồn

    SQLite 3.31 trở lên tính cột tính toán theo cùng hai cách.

  • generated columns with functions SQLite lacks

    một cột thường với các giá trị

    Công thức không viết được cho SQLite để lại một cột thường với giá trị của bản dump và một dòng trong báo cáo.

    Dòng báo cáo: generated_not_translated

  • defaults with functions SQLite lacks, and defaults from a sequence

    không có giá trị mặc định

    Giá trị mặc định không viết được cho SQLite sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: default_not_translated

  • CHECK constraints

    được chuyển đổi, viết trực tiếp trong CREATE TABLE

    SQLite chỉ nhận ràng buộc kiểm tra trong CREATE TABLE.

  • CHECK constraints with functions SQLite lacks

    không được tạo

    Ràng buộc kiểm tra không viết được cho SQLite sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: check_skipped

  • CHECK ... NOT VALID

    không được tạo

    PostgreSQL chưa bao giờ kiểm tra các hàng có từ trước, và SQLite sẽ kiểm tra chúng khi nạp.

    Dòng báo cáo: check_not_valid

  • gin, gist, brin and hash indexes, partial and expression indexes

    không được tạo

    IntoSQL ghi chỉ mục b-tree trên cột cho SQLite; hãy tạo lại các chỉ mục khác sau khi nạp.

    Dòng báo cáo: index_skipped

  • foreign keys

    trong CREATE TABLE, nạp không kiểm tra, rồi liệt kê bằng PRAGMA foreign_key_check

    SQLite chỉ nhận khóa ngoại trong CREATE TABLE và chỉ kiểm tra khi bật PRAGMA foreign_keys. Các hàng nạp không kiểm tra và cuối tập lệnh liệt kê mọi hàng không có hàng cha.

  • foreign keys to tables the dump doesn't create

    không được tạo

    Khóa không thể tham chiếu tới bảng không tồn tại.

    Dòng báo cáo: foreign_key_skipped

  • partitioned tables

    một bảng chứa các hàng của mọi phân vùng

    Các hàng giữ nguyên.

    Dòng báo cáo: partitions_dropped

  • schemas

    một tệp, mỗi bảng có tên schema ở đầu

    Tệp SQLite là một cơ sở dữ liệu, nên tên schema giúp phân biệt các bảng cùng tên; bảng trong public giữ tên.

    Dòng báo cáo: schemas_merged

  • views, functions, procedures, triggers, rules, policies, extensions and types

    được liệt kê trong báo cáo

    Mã của chúng viết bằng ngôn ngữ của PostgreSQL, nên được liệt kê để bạn tạo lại.

    Dòng báo cáo: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    kiểu suy ra từ giá trị

    Bản dump chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.

    Dòng báo cáo: no_schema

  • expressions in INSERT values

    NULL

    Trình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.

    Dòng báo cáo: expression_value

  • types IntoSQL doesn't know

    TEXT

    Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.

    Dòng báo cáo: unknown_type

  • text that isn't valid in its encoding

    byte lỗi thành ký tự thay thế

    Văn bản SQLite là UTF-8.

    Dòng báo cáo: invalid_utf8_replaced

  • text decoded twice (ñ)

    sao chép nguyên trạng

    Bản dump chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.

    Dòng báo cáo: mojibake_suspected

Trong PostgreSQLTrong SQLiteDòng báo cáo
booleanINTEGER 0 hoặc 1 kèm CHECKSQLite không có kiểu boolean; true và false của nó là 1 và 0.
varchar(n), char(n), textVARCHAR(n) và TEXT, không áp dụng độ dàiSQLite giữ kiểu đã khai báo cho công cụ đọc nhưng không giới hạn độ dài.
numeric(p,s) past 15 digits and numeric without a precisionTEXTSQLite giữ khoảng 15 chữ số có nghĩa trong một số. Số rộng hơn được giữ dạng văn bản để mọi chữ số vẫn chính xác.decimal_as_text
moneyNUMERICSQLite không có kiểu tiền tệ. Số tiền được giữ dạng số, không kèm ký hiệu tiền tệ mà locale của máy chủ đã thêm.type_replaced
intervalTEXT với văn bản của PostgreSQLSQLite không có kiểu interval; văn bản giữ mọi phần.type_replaced
arrays (integer[], text[]...)TEXT chứa mảng JSONSQLite không có mảng. Mảng JSON giữ mọi phần tử và NULL, và các hàm JSON của SQLite đọc được nó.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesTEXT với văn bản của PostgreSQLSQLite không có kiểu tương đương, nên mỗi giá trị giữ văn bản PostgreSQL đã ghi.type_replaced
json, jsonbTEXTCác hàm JSON của SQLite đọc JSON từ văn bản.
timestampDATETIME dạng văn bản ISO 8601SQLite lưu ngày dạng văn bản mà các hàm ngày của nó đọc được.
timestamp with time zoneTIMESTAMP dạng văn bản ISO 8601 theo UTCSQLite không có kiểu giữ được độ lệch, nên mỗi thời điểm được ghi theo UTC: cùng một thời điểm dù bản dump ghi độ lệch nào.moments_as_utc
timeTIME dạng văn bảnSQLite giữ giờ dạng văn bản, kể cả 24:00:00.
infinity, -infinity and BC datesNULLCác hàm ngày của SQLite đọc năm từ 0 đến 9999, không có vô cực. Các giá trị đó trở thành NULL và báo cáo đếm số lượng.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLSQLite lưu NaN là NULL và vô cực của nó không giữ được qua mọi công cụ, nên các giá trị đó trở thành NULL và báo cáo đếm số lượng.invalid_value_null
NOT NULL columns with values that become NULLbỏ NOT NULLCột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.not_null_relaxed
enum typesTEXT kèm CHECK các nhãnVăn bản kèm ràng buộc kiểm tra giữ đúng các giá trị.
enum columns holding values outside their labelsTEXT không có ràng buộc kiểm traGiá trị không có trong các nhãn sẽ vi phạm ràng buộc kiểm tra, nên ràng buộc không được tạo.enum_check_skipped
uuid, inet, cidr, macaddrTEXTSQLite không có các kiểu như vậy; văn bản giữ mọi giá trị.
byteaBLOBByte vẫn là byte.
bit(n), bit varyingINTEGER với giá trị của các bit đến 63 bit; dài hơn là chữ số TEXTChuỗi bit được lưu là số do các bit tạo thành khi còn vừa số nguyên có dấu.
oid, xid, cidINTEGER kèm CHECK không âmSố nguyên 64 bit của SQLite chứa được mọi giá trị.
citext and nondeterministic collationsso sánh chính xácSQLite so sánh văn bản chính xác, trừ khi được chỉ định khác, và NOCASE của nó chỉ bỏ qua hoa thường với chữ ASCII.case_insensitive_collation
serial, identityINTEGER PRIMARY KEY AUTOINCREMENT, tiếp tục sau id lớn nhấtSQLite đếm một khóa chính là toàn bộ một số nguyên, và AUTOINCREMENT giữ cho id không bị dùng lại, như sequence.
serial and identity columns that aren't the whole primary keyINTEGER không có bộ đếmSQLite chỉ đếm cột là toàn bộ khóa chính, nên cột giữ giá trị và hàng mới cần tự có giá trị.counter_dropped
sequences not owned by a columnkhông được tạoSQLite không có sequence.sequence_not_converted
generated columnsGENERATED ALWAYS AS, STORED hoặc VIRTUAL như trong nguồnSQLite 3.31 trở lên tính cột tính toán theo cùng hai cách.
generated columns with functions SQLite lacksmột cột thường với các giá trịCông thức không viết được cho SQLite để lại một cột thường với giá trị của bản dump và một dòng trong báo cáo.generated_not_translated
defaults with functions SQLite lacks, and defaults from a sequencekhông có giá trị mặc địnhGiá trị mặc định không viết được cho SQLite sẽ bị bỏ và được báo cáo.default_not_translated
CHECK constraintsđược chuyển đổi, viết trực tiếp trong CREATE TABLESQLite chỉ nhận ràng buộc kiểm tra trong CREATE TABLE.
CHECK constraints with functions SQLite lackskhông được tạoRàng buộc kiểm tra không viết được cho SQLite sẽ bị bỏ và được báo cáo.check_skipped
CHECK ... NOT VALIDkhông được tạoPostgreSQL chưa bao giờ kiểm tra các hàng có từ trước, và SQLite sẽ kiểm tra chúng khi nạp.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexeskhông được tạoIntoSQL ghi chỉ mục b-tree trên cột cho SQLite; hãy tạo lại các chỉ mục khác sau khi nạp.index_skipped
foreign keystrong CREATE TABLE, nạp không kiểm tra, rồi liệt kê bằng PRAGMA foreign_key_checkSQLite chỉ nhận khóa ngoại trong CREATE TABLE và chỉ kiểm tra khi bật PRAGMA foreign_keys. Các hàng nạp không kiểm tra và cuối tập lệnh liệt kê mọi hàng không có hàng cha.
foreign keys to tables the dump doesn't createkhông được tạoKhóa không thể tham chiếu tới bảng không tồn tại.foreign_key_skipped
partitioned tablesmột bảng chứa các hàng của mọi phân vùngCác hàng giữ nguyên.partitions_dropped
schemasmột tệp, mỗi bảng có tên schema ở đầuTệp SQLite là một cơ sở dữ liệu, nên tên schema giúp phân biệt các bảng cùng tên; bảng trong public giữ tên.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typesđược liệt kê trong báo cáoMã của chúng viết bằng ngôn ngữ của PostgreSQL, nên được liệt kê để bạn tạo lại.not_converted_objects
dumps without CREATE TABLE (--data-only)kiểu suy ra từ giá trịBản dump chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.no_schema
expressions in INSERT valuesNULLTrình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.expression_value
types IntoSQL doesn't knowTEXTVăn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.unknown_type
text that isn't valid in its encodingbyte lỗi thành ký tự thay thếVăn bản SQLite là UTF-8.invalid_utf8_replaced
text decoded twice (ñ)sao chép nguyên trạngBản dump chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.mojibake_suspected

Nạp tập lệnh vào SQLite

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

sqlite3 -bail mydb.sqlite < postgresql.sqlite.sql

Khóa ngoại được khai báo trong từng bảng và các hàng được nạp khi tắt kiểm tra khóa ngoại. Sau đó tập lệnh liệt kê mọi hàng trỏ tới hàng không tồn tại, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy nạp vào một tệp mới trên ổ đĩa cục bộ. Tập lệnh nạp mọi thứ trong một giao dịch với đồng bộ đĩa tắt, nên chạy ở tốc độ của ổ đĩa, và lần nạp dừng giữa chừng không để lại bảng dở dang.

Dòng lệnh nạp tệp thẳng vào cơ sở dữ liệu SQLite, không cần tạo tập lệnh. Hoàn toàn miễn phí.

Tạo bản dump PostgreSQL để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

  • --format=plain, mặc định của pg_dump, ghi ra SQL. Kho lưu trữ custom hoặc directory (-Fc, -Fd) thành SQL bằng pg_restore -f dump.sql, không cần máy chủ cơ sở dữ liệu.
  • --no-owner --no-privileges bỏ vai trò và quyền, những thứ trình chuyển đổi vốn bỏ qua, nên bản dump nhỏ hơn.
  • pg_dumpall dump mọi cơ sở dữ liệu vào một tệp; bảng của mỗi cơ sở dữ liệu có tên của nó ở đầu, nên không có gì trùng.

Những gì không được chuyển đổi

Khung nhìn, khung nhìn cụ thể hóa, hàm, thủ tục, trình kích hoạt, quy tắc, chính sách bảo mật cấp hàng, tiện ích mở rộng và kiểu được viết bằng ngôn ngữ riêng của PostgreSQL. Chúng được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn viết lại cho SQLite.

Câu hỏi về PostgreSQL sang SQLite

Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ

Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

Nó có đọc được kho lưu trữ pg_dump -Fc không?

Không trực tiếp: kho lưu trữ custom là định dạng nhị phân. pg_restore -f dump.sql dump.backup chuyển nó thành SQL dạng plain mà trình chuyển đổi đọc được, không cần kết nối máy chủ. Trình chuyển đổi sẽ báo khi nhận một kho lưu trữ.

Bản dump có thể đến từ những phiên bản PostgreSQL nào?

Bản dump do pg_dump và pg_dumpall ghi từ PostgreSQL 10 trở lên, với các hàng COPY hoặc INSERT. Mọi bản dump thử nghiệm đến từ PostgreSQL 13 và 18 và được so với nguồn từng ô một.

Giá trị serial và identity có được giữ không?

Cột serial hoặc identity là toàn bộ khóa chính của bảng trở thành INTEGER PRIMARY KEY AUTOINCREMENT, mọi hàng giữ id của nó, và id tiếp theo tiếp tục sau id lớn nhất. Cột khác giữ giá trị mà không có bộ đếm, và báo cáo ghi rõ điều đó.

Mảng, enum và các kiểu PostgreSQL khác sẽ ra sao?

Mảng thành mảng JSON, boolean thành 0 và 1, enum thành text kèm ràng buộc kiểm tra nhãn, và timestamp có múi giờ thành văn bản UTC. Số numeric rộng vẫn chính xác dạng văn bản. Range, kiểu hình học và kiểu composite giữ văn bản của PostgreSQL.

Còn hàm, trình kích hoạt và khung nhìn thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, vì mỗi cơ sở dữ liệu viết chúng bằng ngôn ngữ riêng.

Tập lệnh nạp được trên những phiên bản SQLite nào?

SQLite 3.31 trở lên. Mọi bản dump thử nghiệm đều nạp được trên 3.31 và 3.54, và dừng ở lỗi đầu tiên nếu có sự cố.