---
metadata:
  - name: generator
    content: Diplodoc Platform v5.55.2
alternate:
  - https://yandex.ru/support/forms/en/send-to-database.md
  - https://yandex.ru/support/forms/ru/send-to-database.md
  - href: ru/send-to-database.md
    type: text/markdown
    title: Markdown version
  - href: llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.ru/support/forms/ru/llms.txt

# Передать ответы в базу данных с помощью Cloud Functions

Вы можете передавать ответы на форму в базу данных PostgreSQL, созданную в Yandex Cloud, и хранить их там.

## Шаг 1. Создать базу данных

1. Перейдите в [консоль Yandex Cloud](https://console.cloud.yandex.ru) и выберите каталог, в котором хотите создать базу данных.
1. На панели слева нажмите ![](_assets/svg/dots-9.svg) и выберите сервис Managed Service for PostgreSQL.
1. В правом верхнем углу нажмите **Создать кластер**.
1. Настройте кластер:
	1. В разделе **Базовые параметры** заполните поле **Имя кластера**. Оно может содержать строчные и прописные буквы латинского алфавита, цифры, нижние подчеркивания и дефисы.
	1. В разделе **База данных** заполните поля **Имя БД** и **Имя пользвателя**. Они могут содержать строчные и прописные буквы латинского алфавита, цифры, нижние подчеркивания и дефисы.
	1. В разделе **База данных** заполните поле **Пароль**.
	1. В разделе **База данных** в полях **Локаль сортировки (LC_COLLATE)** и **Локаль набора символов (LC_CTYPE)** установите значение **en_US.UTF8**. После создания базы данных изменить эти параметры не получится.
	1. В разделе **Дополнительные настройки** включите опции **Доступ из консоли управления** и **Доступ из Serverless**.
	1. При желании настройте другие параметры. Подробнее в разделе [{#T}](https://yandex.cloud/ru/docs/managed-postgresql/operations/cluster-create).
1. Нажмите **Создать кластер**.
1. Дождитесь, когда в у нового кластера поле **Доступность** примет значение **Alive**.

## Шаг 2. Создать таблицу

1. Перейдите на страницу созданного кластера.
1. На панели слева нажмите **SQL**.
1. Выберите подходящее имя пользователя и базу данных, введите пароль и нажмите **Подключиться**.
1. Выберите схему **public**.
1. В редакторе SQL выполните следующий запрос:
	```sql
	create table answers(
  		id serial primary key,
  		answer jsonb,
  		created timestamp with time zone default now()
	);
	```

## Шаг 3. Создать подключение к базе данных

1. В [консоли](https://console.cloud.yandex.ru) перейдите обратно в каталог, в котором находится созданный кластер.
1. На панели слева нажмите ![](_assets/svg/dots-9.svg) и выберите сервис Cloud Functions.
1. На панели слева нажмите ![](_assets/svg/database-connect.svg)</svg>.
1. В правом верхнем углу нажмите **Создать подключение**.
1. Настройте подключение:
	1. Заполните поле **Имя**. Оно может содержать только строчные буквы латинского алфавита, цифры и дефисы.
	1. В поле **Тип** выберите **PostgreSQL**.
	1. Запоните поля **Кластер**, **База данных**, **Пользователь** и **Пароль**. Введите в них те значения, которые устанавливали при создании кластера в шаге 1.
1. Нажмите **Создать**.
1. Перейдите на страницу подключения и скопируйте значение поля **Точка входа**.

## Шаг 4. Создать сервисный аккаунт

1. В [консоли](https://console.cloud.yandex.ru) перейдите обратно в каталог, в котором находится созданный кластер.
1. В правом верхнем углу нажмите ![](_assets/svg/actions.svg)</svg> → **Создать сервисный аккаунт**.
1. В окне создания сервисного аккаунта заполните поля:
	1. **Имя** может содержать только строчные буквы латинского алфавита, цифры и дефисы.
	1. **Описание** может содержать любые символы.
	1. В поле **Роли в каталоге** добавьте следующие роли:
		* `serverless.functions.invoker`
		* `serverless.mdbProxies.user`
1. Нажмите **Создать**.

## Шаг 5. Создать ключ сервисного аккаунта

1. В [консоли](https://console.cloud.yandex.ru) перейдите обратно в каталог, в котором находится созданный кластер.
1. Перейдите на вкладку **Сервисные аккаунты**.
1. Выберите нужный аккаунт.
1. На странице аккаунта на верхней панели нажмите **Создать новый ключ** → **Создать API-ключ**.
1. Напишите краткое описание ключа.
1. Нажмите **Создать**.
1. Откроется окно с идентификатором ключа и секретным ключом. Сохраните их в безопасном месте. После закрытия окна доступ к ним получить нельзя.

## Шаг 6. Создать облачную функцию

1. В [консоли](https://console.cloud.yandex.ru) перейдите обратно в каталог, в котором находится созданный кластер.

1. На панели слева нажмите ![](_assets/svg/dots-9.svg) и выберите сервис Cloud Functions.

1. В правом верхнем углу нажмите **Создать функцию**.

1. На странице создания функции заполните поля:
	1. **Имя** может содержать только строчные буквы латинского алфавита, цифры и дефисы.
	1. **Описание** может содержать любые символы.

1. Выберите язык программирования Python.

1. Создайте файл `requirements.txt` и напишите в нем строку:
	```
	psycopg2
	```

1. Создайте или отредактируйте файл `index.py`:
	
	```python
	import json
	import psycopg2

	def run_function(connection, answer, **params) -> int:
		data = {
			'answer': answer,
			'params': params,
		}
		args = (json.dumps(data), )
		with connection.cursor() as c:
			c.execute('insert into answers(answer) values(%s) returning id', args)
			rs = c.fetchone()
			
		connection.commit()
		return rs[0]

	def get_connection(context):
		return psycopg2.connect(
			database="<идентификатор_подключения>",
			user="<имя_пользователя>",
			password=context.token["access_token"],
			host="<точка_входа>",
			port=6432,
			sslmode="require",
		)
	
	def handler(event, context):
    	body = json.loads(event.get('body'))
		params = {
			name: value
			for name, value in body.items()
			if name != 'answer'
		}
		connection = get_connection(context)
		result = {
			'id': run_function(connection, body.get('answer'), **params),
		}

		return {
			'statusCode': 200,
			'body': result,
			'headers': {
				'Content-Type': 'application/json',
			}
		}
	```
	
	В этой функции подставьте значения:
	* `<идентификатор_подключения>` — значение поля **Идентификатор** подключения к базе данных, которое вы создавали в шаге 3. Скопировать его можно на странице подключения.
	* `<имя_пользователя>` — имя пользователя базы данных, которое вы вводили при настройке кластера в шаге 1. Найти его можно на странице кластера во вкладке **Пользователи**.
	* `<точка_входа>` — значение поля **Точка входа** в подключении к базе данных, которое вы создавали в шаге 3. Скопировать его можно на странице подключения.

1. Нажмите **Сохранить изменения**.

1. На странице функции скопируйте значение ее поля **Идентификатор**.

## Шаг 7. Настроить интеграцию

1. Перейдите в форму, ответы на которую хотите передавать в базу данных, и выберите вкладку **Интеграции**.
1. Выберите группу действий, в которой хотите настроить создание задачи, и внизу группы нажмите кнопку Cloud Functions.
1. В поле **Код функции** вставьте идентификатор функции, который скопировали в предыдущем шаге.
1. При желании в разделе **Параметры** выберите дополнительные параметры, которые хотите передать в функцию.
1. Нажмите **Сохранить**.

Теперь все ответы на эту форму будут дополнительно сохраняться в вашей базе данных в таблице **answers**.

<!-- source: ru/_assets/style.md -->

<!-- endsource: ru/_assets/style.md -->
