🧩

Serverpod 1.0.0覚え書き2

2023/03/15に公開

大きな目標

Serverpodについて理解し、活用できるようになる。
https://serverpod.dev/

現状

CURDのbackendでの設定と、Flutter側からの読み込み、の2本のtutorial動画を2周した。

わかったこと

  • まずDockerを立ち上げる。
  • terminalで serverpod create PROJECT
  • 自動的にPROJECT_server, PROJECT_client, PROJECT_flutterという三つのdirectoryができる。
  • まずP_server内にendpointを設定する。
lib/src/endpoints/articool_endpoint.dart

import 'package:serverpod/serverpod.dart';

class ArticoolEndpoint extends Endpoint {
  //Fetch article from DB
  Future<List<Article>> getArticles(
    Session session,
    String? keyword,
  ) async {
    return " ";
    }
}

とりあえずこんな感じ。
申し訳ないけれど、Flutterなら(Key key)って書きそうなところが(Session session)になってるなあ、くらいの理解度。
でも、これはFlutterのmodelとかではなくて、serverに書いてるんだよ、という。

  • protocolフオルダ(勝手にできてる)内にyaml fileを書く。
lib/src/protocol/article_class.yaml

class: Article
table: article
fields:
  title: String
  content: String
  publishedOn: DateTime
  isPrime: bool

とりあえずこんな感じ。

  • terminalで serverpod generate と打つと、組み込まれているPostgreSQLにDBとtableとfieldsが生成される。
  • ついでにアクセス用のpasswordなんかも全部、config/passwords.yaml内にできている。
  • そのほか、あっちこっちに「関連のfile」ができているらしい。

ちなみに、 serverpod generate --watch と打っておくと、更新が自動であっちこっちに反映され、同期されていく。この「あっちこっちに勝手にできる」感が、便利というのか、わけわからんというか、もうまるっきり、自分でどうにかできる世界ではない、という気だけがひしひしとする。

それどころか「自動で生成されています、修正しないでください」というfileまである。

  • endpointに戻って、さっき作ったDBに合わせて、CRUDの関数を書いていく。
import 'package:serverpod/serverpod.dart';

import '../generated/article_class.dart';

class ArticoolEndpoint extends Endpoint {
  //Fetch article from DB
  Future<List<Article>> getArticles(
    Session session,
    String? keyword,
  ) async {
    return await Article.find(
      session,
      where: (t) =>
          keyword != null ? t.title.like('%$keyword%') : Constant(true),
    );
  }

  //Add article in DB
  Future<bool> addArticle(Session session, Article article) async {
    await Article.insert(session, article);
    return true;
  }

  //Update article
  Future<bool> updateArticle(Session session, Article article) async {
    var result = await Article.update(session, article);
    return result;
  }


  //Delete article
  Future<bool> deleteArticle(Session session, int id) async {
    var result = await Article.delete(session, where: (t) => t.id.equals(id));
    return result == 1;
  }
}

こんな感じ。

  • terminalに docker-compose up --build --detach と打つ。
  • さらにterminalで dart bin/main.dart と打つ。
  • すると localhost:8080に ok と表示されて、これが「準備万端」という意味らしい。
  • posticoというかわいいゾウさんを導入する。MySQLのWorkbenchに相当するヤツ。
  • config/development.yamlに生成されている
# This is the database setup for your server.
database:
  host: localhost
  port: 8090
  name: articool
  user: postgres

や、config/passwords.yamlの

# These are passwords used when running the server locally in development mode
development:
  database: 'd0_Uk8qYVUKW3xR_bAkNkTq0XUGZrdah'
  redis: 'obyREhB-q00aPF5C2I31sYery4dSwTA9'

を見ながらposticoの接続をする。


ここが抜けていたので追加

server直下のgenerated (lib/src下のgeneratedではない)内の
table.pgsql を全部コピーして、
posticoの SQL query に貼り付け
全選択して Execute Selectionボタンを押すと tableができ、fieldも既にそこにある


  • DBもtableもfieldもできているので、適当にいくつか情報を入れて、Flutter側からの呼び出しに備える。

続きはまた。

Flutter大学

Discussion