← Hyperdrive (Postgres & MySQL) / hyperdrive / tutorials
Vytvořte serverless a globálně distribuované API pro časové řady s Timescale
V tomto tutoriálu se naučíte vytvořit API na Workers, které bude přijímat a dotazovat časové řady dat uložených v Timescale ↗ (zrychlují PostgreSQL v cloudu).
Vytvoříte a nasadíte funkci Worker, která zpřístupní API routy pro příjem dat, a použijete Hyperdrive ↗ k proxování vašeho připojení k databázi z edge sítě a k udržování fondu připojení, aby nebylo nutné vytvářet nové připojení k databázi při každém požadavku.
Naučíte se, jak:
- Vytvořte a nasaďte Cloudflare Worker.
- Worker secrets použijte prostřednictvím Wrangler CLI.
- Nasaďte databázovou službu Timescale.
- Připojte svůj Worker ke službě databáze Timescale pomocí Hyperdrive.
- Odešlete dotaz na nové API.
Více o Timescale se dozvíte přečtením jejich dokumentace ↗.
1. Vytvořte projekt Worker
Spusťte následující příkaz a z příkazové řádky vytvořte projekt Worker:
npm create cloudflare@latest -- timescale-apiPři nastavení vyberte následující možnosti:
- Pro S čím byste chtěli začít?, vyberte
Hello World example. - Pro Jakou šablonu chcete použít?, vyberte
Worker only. - Pro Jaký jazyk chcete použít?, vyberte
TypeScript. - Pro Chcete používat git pro správu verzí?, vyberte
Yes. - Pro Chcete nasadit svou aplikaci?, vyberte
No(před nasazením provedeme ještě několik změn).
Poznamenejte si URL, na kterou byla vaše aplikace nasazena. Budete ji potřebovat při konfiguraci GitHub webhooku.
Přejděte do adresáře, který jste právě vytvořili pro svůj projekt Worker:
cd timescale-api2. Připravte svou Timescale Service
Pokud vytváříte novou službu, přejděte na Timescale Console ↗ a postupujte podle těchto kroků:
- Vyberte Create Service kliknutím na černé plus v pravém horním rohu.
- Vyberte Časové řady jako typ služby.
- Zvolte požadovaný region a velikost instance. Pro tento návod postačí 1 CPU.
- Nastavte název služby, který nahradí ten náhodně vygenerovaný.
- Vyberte Create Service.
- Na pravé straně rozbalte Informace o připojení dialogovém okně a zkopírujte URL služby.
- Zkopírujte zobrazené heslo. Znovu ho už později zobrazit nepůjde.
- Vyberte Heslo mám uložené, přejít na přehled služby.
Pokud používáte službu, kterou jste vytvořili dříve, informace o připojení ke službě najdete v Timescale Console ↗:
- Vyberte službu (databázi), ke které se má Hyperdrive připojit.
- Rozbalit Informace o připojení.
- Zkopírujte URL služby. Service URL je připojovací řetězec, který Hyperdrive použije k připojení. Tento řetězec obsahuje název hostitele databáze, číslo portu a název databáze.
Vložte své heslo do URL služby následovně (část za znakem @ ponechte beze změny):
postgres://tsdbadmin:YOURPASSWORD@...Dále bude označováno jako SERVICEURL v následujících částech.
3. Vytvořte svou Hypertable
Timescale umožňuje převést běžné tabulky PostgreSQL na hypertables ↗, tabulky určené pro časové řady, události nebo analytická data. Po této změně Timescale automaticky spravuje rozdělení hypertabulky na oddíly a zároveň umožňuje využívat další funkce, jako je komprese nebo průběžné agregace.
Připojte se ke své databázi Timescale pomocí Service URL, které jste zkopírovali v předchozím kroku (obsahuje vložené heslo).
Pokud používáte výchozí nástroj příkazové řádky PostgreSQL psql ↗ k připojení byste spustili psql podobně jako níže (přičemž nahradíte vaše URL služby z předchozího kroku). Připojit se můžete také pomocí grafického nástroje, jako je PgAdmin ↗.
psql <SERVICEURL>Jakmile jste připojeni, vytvořte tabulku vložením následujícího SQL:
CREATE TABLE readings(
ts timestamptz DEFAULT now() NOT NULL,
sensor UUID NOT NULL,
metadata jsonb,
value numeric NOT NULL
);
SELECT create_hypertable('readings', 'ts');O zbytek se při příjmu a dotazování dat postará Timescale.
4. Vytvořte konfiguraci databáze
Pro vytvoření nové instance Hyperdrive budete potřebovat:
- Váš SERVICEURL z krok 2.
- Název vaší služby Hyperdrive. V tomto tutoriálu použijete hyperdrive.
Hyperdrive využívá create příkaz s --connection-string argument pro předání těchto informací. Spusťte jej následovně:
npx wrangler hyperdrive create hyperdrive --connection-string="SERVICEURL"Tento příkaz vypíše ID vašeho Hyperdrive. Nyní můžete konfiguraci Hyperdrive připojit (bind) k vašemu Workeru v konfiguraci Wrangler tak, že nahradíte obsah následujícím:
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "timescale-api",
"main": "src/index.ts",
// Set this to today's date
"compatibility_date": "2026-08-28",
"compatibility_flags": [
"nodejs_compat"
],
"hyperdrive": [
{
"binding": "HYPERDRIVE",
"id": "your-id-here"
}
]
}"$schema" = "./node_modules/wrangler/config-schema.json"
name = "timescale-api"
main = "src/index.ts"
# Set this to today's date
compatibility_date = "2026-08-28"
compatibility_flags = [ "nodejs_compat" ]
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "your-id-here"Nainstalujte ovladač Postgres do svého projektu Worker:
npm i pgNyní zkopírujte níže uvedený kód Workeru a nahraďte jím aktuální kód v ./src/index.ts. Následující kód:
- Pro připojení k Timescale využívá Hyperdrive připojovací řetězec vygenerovaný z
env.HYPERDRIVE.connectionStringpřímo ovladači. - Vytvoří
POSTtrasu, která přijímá pole odečtů JSON a vkládá je do Timescale v rámci jedné transakce. - Vytvoří
GETtrasu, která přijímálimitparametr a vrací nejnovější naměřené hodnoty. Toto řešení lze upravit tak, aby filtrovalo podle ID nebo podle časového razítka.
import { Client } from "pg";
export interface Env {
HYPERDRIVE: Hyperdrive;
}
export default {
async fetch(request, env, ctx): Promise<Response> {
// Create a new client on each request. Hyperdrive maintains the underlying
// database connection pool, so creating a new client is fast.
const client = new Client({
connectionString: env.HYPERDRIVE.connectionString,
});
await client.connect();
const url = new URL(request.url);
// Create a route for inserting JSON as readings
if (request.method === "POST" && url.pathname === "/readings") {
// Parse the request's JSON payload
const productData = await request.json();
// Write the raw query. You are using jsonb_to_recordset to expand the JSON
// to PG INSERT format to insert all items at once, and using coalesce to
// insert with the current timestamp if no ts field exists
const insertQuery = `
INSERT INTO readings (ts, sensor, metadata, value)
SELECT coalesce(ts, now()), sensor, metadata, value FROM jsonb_to_recordset($1::jsonb)
AS t(ts timestamptz, sensor UUID, metadata jsonb, value numeric)
`;
const insertResult = await client.query(insertQuery, [
JSON.stringify(productData),
]);
// Collect the raw row count inserted to return
const resp = new Response(JSON.stringify(insertResult.rowCount), {
headers: { "Content-Type": "application/json" },
});
return resp;
// Create a route for querying within a time-frame
} else if (request.method === "GET" && url.pathname === "/readings") {
const limit = url.searchParams.get("limit");
// Query the readings table using the limit param passed
const result = await client.query(
"SELECT * FROM readings ORDER BY ts DESC LIMIT $1",
[limit],
);
// Return the result as JSON
const resp = new Response(JSON.stringify(result.rows), {
headers: { "Content-Type": "application/json" },
});
return resp;
}
},
} satisfies ExportedHandler<Env>;5. Nasaďte svůj Worker
Spusťte následující příkaz a znovu nasaďte svůj Worker:
npx wrangler deployVaše aplikace je nyní spuštěná a dostupná na adrese timescale-api.<YOUR_SUBDOMAIN>.workers.dev. Přesné URI se zobrazí ve výstupu příkazu wrangler, který jste právě spustili.
Po nasazení můžete se svou databází Timescale s IoT záznamy komunikovat pomocí Cloudflare Worker. Připojení z edge bude rychlejší, protože k připojení z edge využíváte Cloudflare Hyperdrive.
Svůj Cloudflare Worker nyní můžete použít k vkládání nových řádků do readings tabulky. Chcete-li tuto funkci otestovat, odešlete POST požadavek na URL adresu vašeho Workeru s /readings cestu spolu s JSON payloadem obsahujícím data nového produktu:
[
{ "sensor": "6f3e43a4-d1c1-4cb6-b928-0ac0efaf84a5", "value": 0.3 },
{ "sensor": "d538f9fa-f6de-46e5-9fa2-d7ee9a0f0a68", "value": 10.8 },
{ "sensor": "5cb674a0-460d-4c80-8113-28927f658f5f", "value": 18.8 },
{ "sensor": "03307bae-d5b8-42ad-8f17-1c810e0fbe63", "value": 20.0 },
{ "sensor": "64494acc-4aa5-413c-bd09-2e5b3ece8ad7", "value": 13.1 },
{ "sensor": "0a361f03-d7ec-4e61-822f-2857b52b74b3", "value": 1.1 },
{ "sensor": "50f91cdc-fd19-40d2-b2b0-c90db3394981", "value": 10.3 }
]Tento návod vynechává ts (časové razítko) a metadata (JSON blob) tak, aby byly nastaveny na now() a NULL v uvedeném pořadí.
Jakmile odešlete POST požadavku můžete také odeslat GET požadavek na URL adresu vašeho Workeru s /readings cestě. Nastavte limit parametr pro řízení počtu vrácených záznamů.
Pokud máte curl nainstalovaný můžete otestovat pomocí následujících příkazů (nahraďte <YOUR_SUBDOMAIN> s vaší subdoménou z výše uvedeného příkazu pro nasazení):
curl --request POST --data @- 'https://timescale-api.<YOUR_SUBDOMAIN>.workers.dev/readings' <<EOF
[
{ "sensor": "6f3e43a4-d1c1-4cb6-b928-0ac0efaf84a5", "value":0.3},
{ "sensor": "d538f9fa-f6de-46e5-9fa2-d7ee9a0f0a68", "value":10.8},
{ "sensor": "5cb674a0-460d-4c80-8113-28927f658f5f", "value":18.8},
{ "sensor": "03307bae-d5b8-42ad-8f17-1c810e0fbe63", "value":20.0},
{ "sensor": "64494acc-4aa5-413c-bd09-2e5b3ece8ad7", "value":13.1},
{ "sensor": "0a361f03-d7ec-4e61-822f-2857b52b74b3", "value":1.1},
{ "sensor": "50f91cdc-fd19-40d2-b2b0-c90db3394981", "metadata": {"color": "blue" }, "value":10.3}
]
EOFcurl "https://timescale-api.<YOUR_SUBDOMAIN>.workers.dev/readings?limit=10"V tomto tutoriálu jste se naučili, jak vytvořit funkční příklad pro příjem a dotazování naměřených hodnot z edge pomocí Timescale, Workers, Hyperdrive a TypeScript.
Další kroky
- Další informace o Jak funguje Hyperdrive.
- Další informace o Timescale ↗.
- Viz průvodce řešením problémů pro ladění běžných problémů.