← Cloudflare D1 / d1 / best-practices
Import a export dat
D1 umožňuje přímo importovat existující tabulky SQLite i jejich data, díky čemuž můžete stávající data rychle a snadno migrovat do D1. To se hodí při migraci aplikací na Workers a D1, nebo když chcete schéma nejprve otestovat lokálně, než ho importujete do své databáze (databází) D1.
D1 také umožňuje exportovat databázi. To se hodí pro lokální vývoj nebo testování.
Import existující databáze
Pro import existující databáze SQLite do D1 potřebujete:
- Cloudflare Nainstalované Wrangler CLI.
- Databáze, která se použije jako cíl.
- Existující soubor databáze SQLite (verze 3.0 a vyšší) určený k importu.
Uvažujme například následující users_export.sql schéma a hodnoty, což zahrnuje CREATE TABLE IF NOT EXISTS příkaz:
CREATE TABLE IF NOT EXISTS users (
id VARCHAR(50),
full_name VARCHAR(50),
created_on DATE
);
INSERT INTO users (id, full_name, created_on) VALUES ('01GREFXCN9519NRVXWTPG0V0BF', 'Catlaina Harbar', '2022-08-20 05:39:52');
INSERT INTO users (id, full_name, created_on) VALUES ('01GREFXCNBYBGX2GC6ZGY9FMP4', 'Hube Bilverstone', '2022-12-15 21:56:13');
INSERT INTO users (id, full_name, created_on) VALUES ('01GREFXCNCWAJWRQWC2863MYW4', 'Christin Moss', '2022-07-28 04:13:37');
INSERT INTO users (id, full_name, created_on) VALUES ('01GREFXCNDGQNBQAJG1AP0TYXZ', 'Vlad Koche', '2022-11-29 17:40:57');
INSERT INTO users (id, full_name, created_on) VALUES ('01GREFXCNF67KV7FPPSEJVJMEW', 'Riane Zamora', '2022-12-24 06:49:04');S vaším users_export.sql soubor v aktuálním pracovním adresáři, můžete předat --file=users_export.sql příznak pro d1 execute ke spuštění (importu) schématu tabulky a hodnot:
npx wrangler d1 execute example-db --remote --file=users_export.sqlChcete-li potvrdit, že se tabulka importovala správně a lze ji dotazovat, proveďte SELECT příkaz pro načtení všech tabulek z vaší databáze D1:
npx wrangler d1 execute example-db --remote --command "SELECT name FROM sqlite_schema WHERE type='table' ORDER BY name;"...
🌀 To execute on your local development database, remove the --remote flag from your wrangler command.
🚣 Executed 1 commands in 0.3165ms
┌────────┐
│ name │
├────────┤
│ _cf_KV │
├────────┤
│ users │
└────────┘Odtud nyní můžete novou tabulku dotazovat z Workeru používání D1 Workers Binding API.
Převod souborů databáze SQLite
Pokud máte existující databázi SQLite z jiného systému, můžete její tabulky importovat do databáze D1. Pomocí sqlite nástroje příkazové řádky můžete převést .sqlite3 soubor na sérii SQL příkazů, které lze importovat (spustit) v databázi D1.
Pokud máte například surový SQLite dump s názvem db_dump.sqlite3, spusťte následující sqlite příkaz k jeho převodu:
sqlite3 db_dump.sqlite3 .dump > db.sqlJakmile spustíte výše uvedený příkaz, budete muset upravit výstupní soubor SQL tak, aby byl kompatibilní s D1:
- Odebrat
BEGIN TRANSACTIONaCOMMIT;ze souboru - Odstraňte následující příkaz pro vytvoření tabulky (pokud existuje):
CREATE TABLE _cf_KV ( key TEXT PRIMARY KEY, value BLOB ) WITHOUT ROWID;
Poté můžete postupovat podle kroků pro import existující databáze do D1 pomocí .sql soubor vygenerovaný z výpisu databáze jako vstup pro wrangler d1 execute.
Export existující databáze D1
Kromě importu existujících databází SQLite můžete chtít databázi D1 exportovat pro lokální vývoj nebo testování. Databázi D1 můžete exportovat do .sql soubor pomocí wrangler d1 export a poté je spustit (importovat) pomocí d1 execute --file.
Chcete-li exportovat úplné schéma a data databáze D1:
npx wrangler d1 export <database_name> --remote --output=./database.sqlChcete-li exportovat schéma a data jedné tabulky:
npx wrangler d1 export <database_name> --remote --table=<table_name> --output=./table.sqlChcete-li exportovat pouze schéma databáze D1:
npx wrangler d1 export <database_name> --remote --output=./schema.sql --no-dataChcete-li exportovat pouze schéma tabulky D1:
npx wrangler d1 export <database_name> --remote --table=<table_name> --output=./schema.sql --no-dataChcete-li exportovat pouze data databáze D1:
npx wrangler d1 export <database_name> --remote --output=./data.sql --no-schemaChcete-li exportovat pouze data tabulky D1:
npx wrangler d1 export <database_name> --remote --table=<table_name> --output=./data.sql --no-schemaZnámá omezení
- Export není podporován u virtuálních tabulek, včetně databází, které virtuální tabulky obsahují. D1 podporuje virtuální tabulky pro fulltextové vyhledávání pomocí SQLite modul FTS5 ↗. Jako řešení odstraňte všechny virtuální tabulky, proveďte export a poté virtuální tabulky znovu vytvořte.
- Probíhající export zablokuje ostatní požadavky na databázi.
- Jakákoli číselná hodnota ve sloupci podléhá 52bitové přesnosti čísel v JavaScriptu. Pokud uložíte velmi velké číslo (v
int64) a poté stejnou hodnotu načtete, vrácená hodnota může být méně přesná než vaše původní číslo.
Řešení potíží
Pokud při pokusu o import existujícího schématu nebo datové sady do D1 obdržíte chybu:
- Ujistěte se, že importujete data ve formátu SQL (obvykle s
.sqlpřípona souboru). Další informace najdete v jak převést soubory SQLite pokud máte.sqlite3databázový dump. - Ujistěte se, že schéma je SQLite3 ↗ kompatibilní. Data z databáze MySQL nebo PostgreSQL nelze do D1 importovat, protože typy a syntaxe SQL nejsou přímo kompatibilní.
- Pokud máte mezi tabulkami vztahy cizích klíčů, dbejte na to, abyste tabulky importovali ve správném pořadí. Nelze odkazovat na tabulku, která ještě neexistuje.
- Pokud obdržíte
"cannot start a transaction within a transaction"chybu, ujistěte se, že jste odstraniliBEGIN TRANSACTIONaCOMMITz exportovaných SQL příkazů.
Vyřešte Statement too long chyba
Pokud narazíte na Statement too long chybu při pokusu o import velkého SQL souboru do D1, znamená to, že jeden z SQL příkazů v souboru přesahuje maximální povolenou délku.
Tento problém vyřešíte převedením jednoho velkého INSERT příkaz na více menších INSERT příkazy. Místo vložení 1 000 řádků jedním příkazem je například rozdělte do čtyř skupin po 250 řádcích, jak ukazuje kód níže.
Před:
INSERT INTO users (id, full_name, created_on)
VALUES
('1', 'Jacquelin Elara', '2022-08-20 05:39:52'),
('2', 'Hubert Simmons', '2022-12-15 21:56:13'),
...
('1000', 'Boris Pewter', '2022-12-24 07:59:54');Poté:
INSERT INTO users (id, full_name, created_on)
VALUES
('1', 'Jacquelin Elara', '2022-08-20 05:39:52'),
...
('100', 'Eddy Orelo', '2022-12-15 22:16:15');
...
INSERT INTO users (id, full_name, created_on)
VALUES
('901', 'Roran Eroi', '2022-08-20 05:39:52'),
...
('1000', 'Boris Pewter', '2022-12-15 22:16:15');Omezení cizího klíče
Při importu dat možná budete muset dočasně vypnout omezení cizích klíčů. Za tímto účelem zavolejte PRAGMA defer_foreign_keys = true před provedením změn, které by porušily cizí klíče.
Viz dokumentace k cizím klíčům a dozvíte se více o práci s cizími klíči a D1.
Další kroky
- Přečtěte si SQLite
CREATE TABLE↗ dokumentace. - Přečtěte si, jak použijte D1 Workers Binding API z Workeru.
- Pochopte, jak fungují migrace databáze s D1.