Einleitend
Dieser Artikel ist eine Fortsetzung dieses Artikels . Darin untersuchten wir die Erstellung und Konfiguration der Yandex-Cloud-Funktionen des Telegramm-Bots. Und heute werden wir überlegen, die Telegramme des Bots mit der Datenbank zu verbinden und alle Informationen über den Benutzer zu speichern, mit dem der Bot kommuniziert.
Wir werden die Yandex Cloud-Datenbank als Datenbank verwenden .
Aufgaben
Erstellen Sie eine Datenbank.
Bereiten Sie die Basis für den Anschluss vor.
Abhängigkeiten installieren;
Fügen Sie der Datenbank eine Tabelle hinzu, um den Benutzer zu speichern.
Speichern Sie Informationen über den eingehenden Benutzer in einer Telegrammnachricht.
Holen Sie sich Informationen und senden Sie sie aus der Datenbank an den Benutzer.
Datenbankerstellung
Als einfachste Aufgabe auf unserer Liste müssen wir unter unserem Konto zur Yandex Cloud Console gehen . Wählen Sie dann im Menü der Steuerkonsole die Option Yandex-Datenbank.
Wo finde ich die Schaltfläche?

Klicken Sie auf die Schaltfläche
. Hier können wir den Basisnamen und den Typ festlegen. Als Typ empfehle ich die Auswahl von Serverless, da wir nur sehr wenig Verkehr haben und nicht viele Daten speichern. Gut gemacht! Wir haben eine Datenbank erstellt.
Einrichten einer Datenbankverbindung
Um die Datenbank zu verbinden, müssen wir eine eigene Liste von Aufgaben erstellen:
Erstellen eines Dienstkontos und Abrufen von Schlüsseln für den Zugriff auf die Datenbank;
python (boto3);
.


editor. .

" " " ". - . DocAPI Yandex Cloud Database.
( Yandex Database), - " ". 3.7 preview ( ).

'requirements.txt', . boto3, SDK AWS, Yandex Database DynamoDB. 2 - .

!
. / 1 , . .
import json
import logging
import os
import boto3
from botocore.exceptions import ClientError
def read_user(user_id, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
table = dynamodb.Table('Users')
try:
response = table.get_item(Key={'user_id': str(user_id)})
except ClientError as e:
print(e.response['Error']['Message'])
else:
return response
def create_user(user_id, first_name, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
table = dynamodb.Table('Users')
response = table.put_item(
Item={
'user_id': str(user_id),
'first_name': str(first_name)
}
)
return response
def handler(event, context):
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
body = json.loads(event['body'])
user_query = read_user(body['message']['chat']['id'], dynamodb)
if 'Item' not in user_query:
create_user(body['message']['chat']['id'], body['message']['from']['first_name'], dynamodb)
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': '! :)'
}),
'isBase64Encoded': False
}
user = user_query['Item']
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': f', {user["first_name"]}!'
}),
'isBase64Encoded': False
}3 .
KEY , , (Document API).


:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)boto3 . endpoint_url - , - .
, !
/ . , . 1 :
import os
import boto3
def create_user_table():
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=USER_STORAGE_URL,
region_name = 'us-east-1',
aws_access_key_id = AWS_ACCESS_KEY_ID,
aws_secret_access_key = AWS_SECRET_ACCESS_KEY
)
table = dynamodb.create_table(
TableName = 'Users',
KeySchema=[
{
'AttributeName': 'user_id',
'KeyType': 'HASH' # Partition key
}
],
AttributeDefinitions=[
{'AttributeName': 'user_id', 'AttributeType': 'S'}
]
)
return table
create_user_table(), 1 . , , . .
dynamodb.create_table. (TableName), (KeySchema) (AttributeDefinitions). . .
main.py :
def read_user(user_id, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
table = dynamodb.Table('Users')
try:
response = table.get_item(Key={'user_id': str(user_id)})
except ClientError as e:
print(e.response['Error']['Message'])
else:
return responseuser_id ( id ) ().
, user_id first_name , :
def create_user(user_id, first_name, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
table = dynamodb.Table('Users')
response = table.put_item(
Item={
'user_id': str(user_id),
'first_name': str(first_name)
}
)
return response:
def handler(event, context):
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
body = json.loads(event['body'])
user_query = read_user(body['message']['chat']['id'], dynamodb)
if 'Item' not in user_query:
create_user(body['message']['chat']['id'], body['message']['from']['first_name'], dynamodb)
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': '! :)'
}),
'isBase64Encoded': False
}
user = user_query['Item']
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': f', {user["first_name"]}!'
}),
'isBase64Encoded': False
}10 12 . 10 , 11 . 12 .

, . .
Im nächsten Schritt plane ich, ein Menü zu entwickeln und bereits eine Anwendung zu implementieren, in der einfach Bestellungen aufgegeben werden können.