>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
TypeScript

Relacyjna baza danych przebrana za znajome arkusze kalkulacyjne

Każdy programista рано czy późno napotyka sytuację, w której biznes lub zarząd potrzebuje wygodnego interfejsu do pracy z danymi. Zazwyczaj opcje są ograniczone. Albo wdrażamy nieporęczny panel administracyjny jak Django Admin lub Forest Admin, albo przekazujemy wszystko do Google Sheets, gdzie w ciągu tygodnia formuły się psują, typy danych mieszają się, a połączenie dwóch tabel przez klucz obcy staje się koszmarem z VLOOKUP.

Jakiś czas temu natknąłem się na grist-core — silnik open-source, który próbuje połączyć dwa zupełnie różne światy: relacyjne bazy danych i elastyczne arkusze kalkulacyjne.

https://github.com/user-attachments/assets/fe152f60-3d15-4b11-8cb2-05731a90d273

Pod maską

Zajrzawszy pod maskę, Grist nie przypomina standardowych klonów Excela. W klasycznych arkuszach kalkulacyjnych komórka żyje własnym życiem: jeden wiersz w kolumnie może zawierać liczbę, następny ciąg znaków, a poniżej formułę. W Grist kolumny są ściśle typowane i działają jak pola w tabelach SQL.

Jednocześnie każdy dokument to zwykły plik SQLite. Oznacza to, że Twoje dane nie są zamknięte w zastrzeżonym magazynie. Każde narzędzie potrafiące odczytać SQLite otworzy wyeksportowany plik .grist bezpośrednio. Z perspektywy kopii zapasowych i przenośności między serwerami, to podejście znacząco upraszcza sprawę: chwytasz plik — chwytasz całą bazę danych.

Ciekawostka: francuskie instytucje rządowe (ANCT i DINUM) aktywnie inwestują w bazę kodu, więc projekt konsekwentnie otrzymuje commity związane z dostępnością, lokalizacją i bezpieczeństwem korporacyjnym.

Python zamiast makr i dialektów formuł

Główną killer feature dla każdego, kto potrafi pisać kod, są obliczenia w czystym Pythonie. Nie ma żadnej ograniczonej składni ani dziwnych rozszerzeń. Formuły komórek akceptują standardową składnię Pythona wraz z jego biblioteką standardową.

Na przykład możesz swobodnie używać list comprehensions, cięć stringów, wyrażeń regularnych czy modułu datetime. Jeśli jesteś przyzwyczajony do funkcji tablicowych jak SUM czy AVERAGE, są tutaj również dostępne, ale gdy logika się komplikuje, przejście na Pythona oszczędza wiele nerwów.

# Пример вычисления в колонке: вытаскиваем домен из email и форматируем
if $Email and "@" in $Email:
    domain = $Email.split("@")[1].lower()
    return f"Корпоративный: {domain}" if domain != "gmail.com" else "Личный"
return "Не указан"

Kod wykonuje się w izolowanej piaskownicy. W zależności od środowiska możesz skonfigurować izolację przez gVisor na Linuksie, natywny sandbox-exec na macOS lub Pyodide przez WebAssembly, jeśli wdrażasz na Windows.

Jeśli nie chcesz pisać formuł ręcznie, jest wbudowany asystent AI. Możesz połączyć go z OpenAI lub skonfigurować dowolne inne modele przez OpenRouter, w tym Claude 3.7 Sonnet lub lokalne LLM-y przez LM Studio.

Relacje danych i wizualne dashboardy

W Airtable lub Notion często brakuje właściwej konfiguracji połączonych widoków na jednym ekranie. W Grist przestrzeń robocza jest podzielona na wiele kart lub widżetów, które mogą być ze sobą połączone przez kliknięcie:

  • Tabela klientów po lewej filtruje listę zamówień po prawej.
  • Wybór zamówienia natychmiast aktualizuje kartę szczegółów z opisem w Markdown i załączonymi plikami.
  • Wbudowane widżety kalendarza, wykresów i tabeli podsumowującej grupują metryki bez tworzenia pośrednich ukrytych arkuszy.

Dwukierunkowe referencje (two-way references) działają out of the box: połącz zadanie z sprintem — sprint automatycznie otrzymuje to zadanie dodane do swojej listy połączonych zadań.

Szczegółowa kontrola dostępu

Wiele open-source'owych narzędzi no-code nie radzi sobie z bezpieczeństwem, oferując dostęp na zasadzie „wszystko albo nic”. W grist-core reguły dostępu są definiowane na poziomie pojedynczych tabel, wierszy i kolumn.

Warunki dostępu mogą być również ustawiane przez formuły:

  • Menadżer widzi tylko oferty, gdzie jego email odpowiada polu user.Email.
  • Kolumna płac jest widoczna tylko dla użytkowników z określonym atrybutem SSO.
  • Zablokuj edycję zarchiwizowanych rekordów, jeśli pole Status == 'Closed' jest ustawione.

W przypadku instalacji korporacyjnych obsługiwane jest uwierzytelnianie OIDC, SAML i forward-auth przez proxy (np. Traefik lub Authentik), wraz z provisionowaniem użytkowników przez SCIM.

Szybki start w Dockerze

Możesz wypróbować silnik lokalnie w kilka minut jednym poleceniem:

docker run -p 8484:8484 -v $PWD/persist:/persist -it gristlabs/grist

Po uruchomieniu otwórz http://localhost:8484 w przeglądarce. Kontener wyświetli wygenerowany klucz startowy na konsoli do początkowej konfiguracji administratora. Jeśli chcesz pominąć kreatora i uzyskać pojedynczą instancję bez dodatkowych pytań, po prostu przekaż zmienną środowiskową -e GRIST_IN_SERVICE=true.

Integracja z systemami zewnętrznymi odbywa się przez standardowe REST API i wychodzące webhooki. Co więcej, webhooki są elastycznie konfigurowalne: możesz wyzwalać zdarzenia tylko gdy określone kolumny się zmienią lub gdy spełniony jest dany warunek logiczny.

Porównanie edycji i ograniczeń

Repozytorium grist-core jest rozpowszechniane na licencji Apache 2.0. Bazowy obraz Docker gristlabs/grist zawiera opcjonalny zastrzeżony kod dla funkcji Enterprise, który domyślnie jest wyłączony. Jeśli ściśle potrzebujesz wyłącznie wolnego oprogramowania bez włączeń stron trzecich, deweloperzy budują osobny obraz gristlabs/grist-oss.

Niektóre funkcje zostały przeniesione z czystego core'a grist-core do wersji komercyjnej. Na przykład strumieniowe logi audytu, wbudowane łańcuchy automatyzacji emaili i natywny serwer MCP dla klientów AI. Jednak nic nie stoi na przeszkodzie, żeby podłączyć tego samego Claude'a przez adaptery społecznościowe używając standardowego REST API.

Tłumaczenia interfejsu są zarządzane przez społeczność Weblate:

Translation status

Translation detail

Kto skorzysta na tym projekcie

Jeśli szukasz samodzielnie hostowanej alternatywy dla Airtable bez limitów wierszy i opłat za użytkownika, Grist wygląda na świetnego kandydata.

Idealnie pokrywa potrzeby wewnętrznych CRM-ów, trackerów zapasów, rejestrów finansowych i prostych paneli back-office. Otrzymujesz pełny relacyjny model danych, elastyczność skryptów Pythona i pełną kontrolę nad plikami SQLite na własnym serwerze.

Kod źródłowy i dokumentacja są dostępne w oficjalnym repozytorium gristlabs/grist-core.

Powiązane projekty