GCP FireStore 项目创建&写、读数据


官方文档

创建 FireStore

  1. 创建或选择项目 注意:您不能在一个项目中同时使用 Firestore 和 Cloud Datastore,否则可能会影响使用 App Engine 的应用

  2. 进入 FireStore 选择数据库服务,此处选择原生模式。

  3. 选择 FireStore 位置,这里选择离客户近的。

  4. 创建数据库

设置身份认证

此处选择使用命令行 Cloud Shell,例如:

  1. 创建服务账号

    gcloud iam service-accounts create [NAME]
    

    例如:

    gcloud iam service-accounts create firestore-test
  2. 向服务账号授予权限

    gcloud projects add-iam-policy-binding [PROJECT_ID] --member "serviceAccount:[NAME]@[PROJECT_ID].iam.gserviceaccount.com" --role "roles/owner"

    例如:

    gcloud projects add-iam-policy-binding firestore-test-286306 --member "serviceAccount:firestore-test@firestore-test-286306.iam.gserviceaccount.com" --role "roles/owner"

    上述代码为刚才创建的服务账号,firestore 授予了资源 owner 权限,正式开发时,需要对此权限进行细化。 注:上述的 [PROJECT_ID] 对应项目ID,在创建选择项目时可以看到。

  3. 生成密钥文件

    gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com

    例如:

    gcloud iam service-accounts keys create serives.json --iam-account firestore-test@firestore-test-286306.iam.gserviceaccount.com

    成功设置结果在 Cloud Shell 中返回如下相似内容:

    created key [***] of type [json] as [serives.json] for [firestore-test@firestore-test-286306.iam.gserviceaccount.com]
  4. 通过设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 向应用代码提供身份验证凭据(当然也可以在代码中特殊指定。)

export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

例如:

export GOOGLE_APPLICATION_CREDENTIALS="./serives.json"

初始化 FireStore

安装更新 google-cloud-firestore

pip3 install --upgrade google-cloud-firestore
from google.cloud import firestore

# Project ID is determined by the GCLOUD_PROJECT environment variable
db = firestore.Client()

示例:

bjzws1994@cloudshell:~ (firestore-test-286306)$ ipython3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.17.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from google.cloud import firestore
   ...: 
   ...: # Project ID is determined by the GCLOUD_PROJECT environment variable
   ...: db = firestore.Client()

In [2]: db
Out[2]: <google.cloud.firestore_v1.client.Client at 0x7fbdd3869588>
In [3]: dir(db)
Out[3]: 
['SCOPE',
 '_SET_PROJECT',
 '__class__',
 '__delattr__',
 '__dict__',
...

In [4]: db.project
Out[4]: 'firestore-test-286306'

添加数据

Firestore 将数据存储在文档中,而文档存储在集合中。在首次向文档添加数据时,Firestore 就会隐式创建集合和文档,而不需要显式创建集合或文档。

doc_ref = db.collection(u'users').document(u'alovelace')
doc_ref.set({
    u'first': u'Ada',
    u'last': u'Lovelace',
    u'born': 1815
})

示例:

In [5]: doc_ref = db.collection(u'users').document(u'alovelace')
   ...: doc_ref.set({
   ...:     u'first': u'Ada',
   ...:     u'last': u'Lovelace',
   ...:     u'born': 1815
   ...: })
   ...: 
Out[5]: 
update_time {
  seconds: 1597301218
  nanos: 968333000
}

将另一个文档添加到 users 集合中。请注意,此文档包含第一个文档中没有的一个键值对(中间名)。集合中的文档可以包含不同的信息集。

doc_ref = db.collection(u'users').document(u'aturing')
doc_ref.set({
    u'first': u'Alan',
    u'middle': u'Mathison',
    u'last': u'Turing',
    u'born': 1912
})

也可以使用 GCP consle 创建集合&文档,如下图所示:

添加完后的情况

可以看到,包括我们手动上传的数据,和通过 python 添加的数据,都显示了出来,并在一个集合下。

读取数据

此时已经创建完集合、文档,可以在后台进行查看。

也可以使用 get 方法来检索整个集合。

users_ref = db.collection(u'users')
docs = users_ref.stream()

for doc in docs:
    print(f'{doc.id} => {doc.to_dict()}')

示例:

In [7]: users_ref = db.collection(u'users')
   ...: docs = users_ref.stream()
   ...: 
   ...: for doc in docs:
   ...:     print(f'{doc.id} => {doc.to_dict()}')
   ...: 
alovelace => {'born': 1815, 'last': 'Lovelace', 'first': 'Ada'}
aturing => {'middle': 'Mathison', 'first': 'Alan', 'last': 'Turing', 'born': 1912}

如下图所示,此时 GCP console 中已经可以通过 useage 查看写入情况了。