PythonプログラムとFirestoreを接続して気軽にデータベースを利用する方法を解説!

突然ですが皆さんは単体のプログラムを書いていて、その結果などを気軽にデータベースに保存しておきたいと思うことはないですか?

例えば

  • 定期的にスクレイピングのコードを定期稼働させていて、結果を保存しておきたい!
  • プログラムで出力したログを保存しておきたい!

などのケースですね。

基本MySQLやSQLiteなどのデータベースを作成して接続するにはめんどくさい手順があってちょっとした単体のプログラムに気軽に利用できるものではなかったと思います。

それがFirebaseのCloud Firestoreを利用すると簡単にデータベースに接続できて、しかもブラウザ上でデータの読み書きが可能になってしまいます。

今回はそんな便利なFirestoreとPythonプログラムを接続して気軽にデータベース機能を実装する方法を解説してみようという試みです。

記事の最後にサンプルコードを記載しておくのでコピペして是非動かしてみてください。

Pythonについてよくわからない方やインストール方法が知りたい方は「【初心者向け】Pythonを学習すると何ができるのかとインストール方法を解説」を参考にしてみてください。

【初心者向け】Pythonを学習すると何ができるのかとインストール方法を解説

そもそもFirebaseとは?

本題の前にもしかしたら知らない人もいるかも知れないので、軽くFirebaseとは何か書いていきます。

FirebaseはGoogleが提供しているモバイルおよびWebアプリケーションのバックエンドサービスになります。

形態としてはBaaSに位置付けされます。

(Backend as a Serviceの略)

Webサービスやアプリなどは基本構成としてフロントエンドとバックエンドの領域がありますが、

Firebaseではバックエンドでよく実装される機能がパッケージとして提供されており、それらパッケージを使うことで処理を簡単に実装ができてしまいます。

提供されている機能としては、データベースユーザー認証ホスティングなどがあります。

自分で1からこれらの機能を実装しようとなると思った以上に大変なのはご存知の方も多いと思います。

極端に言ってしまうとバックエンド全ての機能をFirebaseに任せてしまえばバックエンドのコードを全く書かずにアプリが開発が可能です。

しかもそれらの管理まで全てやってもらえる事になりますので非常に開発効率が上がります。

その結果アプリの裏側以外のフロントエンド部分やマーケティング等の時間にリソースを当てることができる様になりアプリの早期リリースにも活躍してくれるというわけです。

FirebaseはもともとはGoogleとは違った別のスタートアップ企業のサービスしたが、2014年に Googleに買収され、自身が運営するGCPのサービスに統合されています。

接続の手順

Firebaseプロジェクトを作成

まずは新規にFirebaseプロジェクトを作成します。

利用にはGoogleアカウントが必要なのでログインを忘れずにしておいてください。

まずはこちらからFirebaseのトップページにアクセスします。

アクセスしたら「使ってみる」をクリックします。

次に新規でプロジェクトを作成します

次にプロジェクト名を作成します。何でもいいので自分のわかりやすい名前を付けましょう。

使用できるのは英数字、スペース、および一部の記号です。(- ! ‘ “)

入力したら「次へ」ボタンを押します。

次にGoogleアナリティクスを利用するかの設定をします。

今回は特にアナリティクスする必要のない軽い用途なのでチェックを外して進めますが、お好みでどうぞ。

決まったら「プロジェクトを作成」をクリックします。

プロジェクトが作成完了するまでしばし待ちます。

プロジェクトを作成できたら「次へ」を押します。

これでFirebaseのプロジェクトが作成完了です。

Firestoreの設定

続いて今回使用するデータベースの設定をしていきます。

Firebaseには現在2種類のデータベースが提供されています。

今回はそのうちの1つであるCloud Firestoreを利用していきます。

まずは左サイドメニューから「Firestore Databese」をクリックして、表示された画面中央からCloud Firestoreの下に表示されている「データベースを作成」をクリックします。

すると「本番環境モード」と「テスト環境モード」を選択するダイアログが出てきます。

今回はお試しなのでテストモードを選択して「次へ」をクリックします。

ただテストモードだとデフォルトでデータが誰にでも参照されてしまうルールになっているので本番運用等には本番環境モードを選択しましょう。

テストモードでもデータベース作成後30日後にクライアントの読み取りと書き込みアクセスが拒否されるので期間が長くなる場合は適時ルールを変更しましょう。

もしテスト環境を選択してFirestoreから急に値が取れなくなったら過去記事が参考になるかもしれないのでこちら参考にしてみてください。

【Firebase/Firestore】Error: [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operationで値が取れない件について

次にデータベースのロケーションを設定します。

基本何でも大丈夫ですが、今回は「asia-northeast1」を選択します。

ちなみにここのロケーションは一度設定すると二度と変更できないので一応注意です。

(asia-northeast1 = 東京リージョン)

この画面になったらFirestoreの設定は完了です。

認証ファイルをダウンロード

次にPythonプログラムでFirestoreを扱うために必要な認証ファイルをダウンロードしてきます。

左サイドメニューの設定アイコンをクリックして「プロジェクトを設定」をクリックします。

次に「サービスアカウント」をクリックします。

そこでPythonにチェックして「秘密鍵の生成」をクリックします。

〇〇.jsonのファイルがダウンロードできれば完了です。

実装

環境

Python 3.7.4

ライブラリのインストール

PythonでFirestoreを扱うために必要なライブラリをpip installします。

bash
$ pip install firebase-admin
$ pip install google-cloud-firestore

サンプルコード

今回はサンプルとしてyahooニュースから注目ニュースをスクレイピングしてくるプログラムを用意して、その結果をFirestoreに保存してみようと思います。

コピペしてすぐに動かせるので試してみてください。

このPythonプログラムと同じ階層に先程ダウンロードしてきた認証ファイルを配置してJSON_PATHにファイル名を格納してください。

この様なディレクトリ構成になればOKです。

root(作業ディレクトリ)
|
|_ sample.py
|_ 〇〇.json(認証ファイル)
sample.py
# sample.py

import requests
from bs4 import BeautifulSoup
import re
import datetime
from firebase_admin import firestore
import firebase_admin
from firebase_admin import credentials


def main():
    # ===================== Firebase =====================================
    # このPythonファイルと同じ階層に認証ファイルを配置して、ファイル名を格納
    JSON_PATH = '〇〇.json'

    # Firebase初期化
    cred = credentials.Certificate(JSON_PATH)
    firebase_admin.initialize_app(cred)
    db = firestore.client()
    # ====================================================================

    dt_now = datetime.datetime.now()
    url = 'https://news.yahoo.co.jp/categories/domestic'
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    res = soup.find_all(href=re.compile('news.yahoo.co.jp/pickup'))

    for news in res:
        try:
       # Firestoreのコレクションにアクセス
            doc_ref = db.collection('news')
       # Firestoreにドキュメントidを指定しないで1つづつニュースを保存
            doc_ref.add({
                'title': news.text,
                'url': news.attrs['href'],
                'date': dt_now.strftime('%Y年%m月%d日'),
            })
        except:
            print('error')

    print('done')


if __name__ == '__main__':
    main()

プログラム実行後にブラウザで確認してみると無事にプログラムとFirestoreが接続されていて、スクレイピングされた要素が保存されているのが分かると思います。

おわりに

ここまでPythonで書いたプログラムにFiresotreを接続して簡単にデータを保存する方法を解説してきました。

Pythonに限らず、他の言語でも同じ様な感じで実装ができると思いますので参考にしてみてください。

思ったよりも簡単にデータベース機能の実装ができるのが分かってもらえたと思うので小規模なプログラムを書く際にも積極的にFirebaseを活用してみてはどうでしょうか。

他にもPython初心者向け記事も投稿してますのでよければ読んでみてください。

【必読】Pythonで仕事を取りたければ絶対読んでおきたいおすすめ技術書を紹介!

【Python初心者向け】形態素解析とマルコフ連鎖を使ってひろゆきっぽい文章を生成してみた

【Python】Django3.2でHelloWorldまでを初学者向けに丁寧に解説していく!

おわり

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です