# DPE SDKのデータストアコネクター

ForePaaSのデータストアは、[MinIO](https://min.io/)テクノロジーに基づいて構築されています。SDKの関数の詳細設定については、[MinIOの技術ドキュメント](https://docs.min.io/docs/python-client-api-reference.html#put_object)を参照してください。

---
## データストアへの接続

ソースと接続する場合と同様に、SDKの`connect`関数を使用します。  
データストアに直接接続してバケットに関する情報を得るか、特定のバケットに直接接続することができます。

```python
from forepaas.worker.connect import connect

datastore = connect('data_store')
bucket = connect('data_store/bucket_name')
```

---
## データストアのメソッド

### datastore.list(return_type = 'array')
データストア内のすべてのバケットを列挙します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| return_type | str | 取得するタイプを特定（`array`または`str`） | |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `str`または`array` | データストア内のバケットのリスト |   |

### datastore.get_buckets()
ForePaaSデータストアのすべてのバケットを取得します。

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `list[bucket]` | `bucket`のインスタンスのリスト |  |

### datastore.get_bucket(bucket_name)
バケットの名前からバケットのインスタンスを取得します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| name | str | バケット名 |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `bucket` | ファイルを処理するためのバケットのインスタンス |  |

### datastore.create_bucket(bucket_name)
データストアにバケットを追加します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| name | str | バケット名 |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `boolean` | 操作の成功 |  |

### datastore.remove_bucket(bucket_name)
データストアからバケットを削除します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| name | str | バケット名 |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `boolean` | 操作の成功 |  |

### datastore.bucket_exists(bucket_name)
バケットが存在するかどうかを確認します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| name | str | バケット名 |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `boolean` | 操作の成功 |  |


---
## バケットのメソッド

### bucket.list(bool metadata=True, bool recursive=True, **kwargs)
データストアのバケットのファイルを列挙します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| metadata | bool | （任意）列挙されたすべてのファイルのメタデータを取得（デフォルトはTrue） |  |
| recursive | bool | （任意）すべてのフォルダーを列挙するかどうかを指定（デフォルトはTrue） |  |
| ```**kwargs``` |  | 残りのキーワード引数は`self.minio.list_objects_v2()`に受け渡し |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `list[Object]` | バケットのファイルのリスト |  |

### bucket.list_filename(return_type='array', contains='', recursive=True, **kwargs)
データストアのバケットのファイル名を列挙します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| return_type | str | 必要な戻り値のタイプ（デフォルトは`array`） |  |
| contains | str | 値を含むファイル名でファイル名のリストをフィルタリング（デフォルトは''） |  |
| recursive | bool | すべてのフォルダーを列挙するかどうかを指定（デフォルトはTrue） |  |
| `**kwargs` |   | 残りのキーワード引数は`self.minio.list_objects_v2()`に受け渡し |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `[str]`または`str` |  | バケットのファイルのリスト（`array`またはカンマ区切りの文字列） |

### bucket.get(file_name, **kwargs)
データストアのバケットから生のファイルの内容を取得します。
```python
from forepaas.worker.connect import connect

ds = connect('data_store')
bucket = ds.get_bucket('my_bucket')
bucket.get('folder/file_name.csv')
data = bucket.get('file_name.csv')
for d in data.stream(32*1024):
	print(d)
```
**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| file_name | str | バケットから取得するファイル名 |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| `urllib3.response.HTTPResponse` | データストア要求の応答 |  |

### bucket.fget(file_name, path, **kwargs)
データストアのバケットからローカルパスにオブジェクトを取得します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| file_name | str | バケットから取得するファイル名 |  |
| path | str | ファイルを保存するローカルパス |  |
| `**kwargs` |  | 残りのキーワード引数は`self.minio.fget_object()`に受け渡し |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| Object | サーバーからのオブジェクト統計情報 |  |

### bucket.put(str file_name, io.RawIOBase data, int length, **kwargs)
データストアのバケットにオブジェクトを配置します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| file_name | str | アップロードするファイルの名前 |  |
| data | `io.RawIOBase` | MinIOにアップロードするデータ |  |
| length | int | データの長さ |  |
| `**kwargs` |  | 残りのキーワード引数は`self.minio.put_object()`に受け渡し |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| str | サーバーによって計算されるオブジェクトのetag |  |

### bucket.fput(file_name, file_path, **kwargs)
データストアのバケットにファイルを配置します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| file_name | str | アップロードするファイルの宛先名 |  |
| file_path | str | ファイルを読み込むローカルファイルシステムのパス |  |
| `**kwargs` |  | 残りのキーワード引数は`self.minio.fput_object()`に受け渡し |  |

**出力**

| タイプ  | 説明 | 例 |
| :---: | :---        | :---    |
| str | サーバーによって計算されるオブジェクトのetag |  |

### bucket.put_request(url, path, data={}, method='GET', headers={}, **kwargs)
HTTP要求からオブジェクトを取得し、データストアのバケットにアップロードします。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| url | str | ファイルの取得元のURL |  |
| path | str | データストアのバケット内のファイルをアップロードする場所（デフォルトは''） |  |
| data | dict | 要求の本文で送信する辞書、タプルのリスト、バイト、またはファイルライクオブジェクト |  |
| method | str | ファイルを取得するのに要求で使用するメソッド（デフォルトは'GET'） |  |
| headers | dict | 要求で送信するヘッダー（デフォルトは{}） |  |

### bucket.delete(path, **kwargs)
データストアのバケット内の複数／1つのファイルを削除します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| path | `str`または`[str]` | 削除するファイルのパス |  |
| `**kwargs` |  | 残りのキーワード引数は`self.minio.remove_object(s)`に受け渡し |  |

### bucket.stat(path, **kwargs)
データストアのバケット内のファイルの統計情報を取得します。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| path | `str`または`[str]` | 統計情報を取得するファイルのパス |
| `**kwargs` |  | 残りのキーワード引数は`self.minio.stat_object()`に受け渡し |  |

### bucket.fcopy_to(new_bucket, object_name, object_source, **kwargs)
バケットのファイルをデータストア内の新しいバケットにコピーします。

**入力パラメータ**

| 名前  | タイプ  | 説明 | 例 |
| :---  | :---: | :---        | :---    |
| new_bucket | str | 新しいオブジェクトのバケット名 |  |
| object_name | str | 新しいオブジェクトの名前 |  |
| object_source | str | コピーするオブジェクトの名前 |  |
| `**kwargs` |  | 残りのキーワード引数はself.minio.copy_objectに受け渡し |  |

---
## 簡単な例
以下は、シンプルなURLから画像をデータストアにアップロードするコード例です。

```python
from forepaas.worker.connect import connect

data_store = connect('data_store')

# Get bucket and upload image from URL to path forepaas/test.jpg.
# And finally get the image from the bucket
bucket_test = data_store.get_bucket('test')

lists = bucket_test.list(recursive=True)

bucket_test.put_request("https://i.stack.imgur.com/r8jTK.jpg", path='forepaas/test.jpg')
data = bucket.get('hello/test.jpg')

# Create a bucket if it does not already exists
if data_store.bucket_exists('test-exists') is False:
    data_store.create_bucket('test-exists')

# Connect directly to the bucket test and remove the file
bucket_test2 = connect('data_store/test')
bucket_test2.delete('hello/test.jpg')
```

{別の例を確認する🧐}(#/jp/technical/sdk/dpe/1B.datastore-crud)