Как записать список в файл в Google Cloud Storage с помощью облачных функций Google с Python - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь записать элементы списка в файл в хранилище в облачном хранилище с помощью облачных функций.

Я нашел эту страницу, показывающую, как выгрузить файл в мое ведро, но мне нужно l oop просмотреть членов моего списка и записать их в файл в облаке Хранилище.

Мне нужно сделать это с помощью облачных функций, которые считывают данные из моей базы данных Google Cloud SQL. Я хочу иметь возможность хранить данные из определенных таблиц в моей базе данных Postre SQL в виде файла в облачном хранилище.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Мне удалось сделать это с помощью следующего python кода:

import datetime
import logging
import os
import sqlalchemy
from google.cloud import storage
import pandas as pd

# Remember - storing secrets in plaintext is potentially unsafe. Consider using
# something like https://cloud.google.com/kms/ to help keep secrets secret.
db_user = "<DB_USER>"#os.environ.get("DB_USER")
db_pass = "<DB_PASS>"#os.environ.get("DB_PASS")
db_name = "<DB_NAME>"#os.environ.get("DB_NAME")
cloud_sql_connection_name = "<Cloud SQL Instance Connection Name>"#os.environ.get("CLOUD_SQL_CONNECTION_NAME")
logger = logging.getLogger()

# [START cloud_sql_postgres_sqlalchemy_create]
db = sqlalchemy.create_engine(
    # Equivalent URL:
    # postgres+pg8000://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432
    sqlalchemy.engine.url.URL(
        drivername='postgres+pg8000',
        username=db_user,
        password=db_pass,
        database=db_name,
        query={
            'unix_sock': '/cloudsql/{}/.s.PGSQL.5432'.format(
                cloud_sql_connection_name)
        }
    ),
    # ... Specify additional properties here.
    pool_size=5,
    max_overflow=2,
    pool_timeout=30,  # 30 seconds
    pool_recycle=1800,  # 30 minutes
)

def read_source_data(request):
    bucket_name = <YOUR_BUCKET_NAME>
    folder_name = "sample_files"
    file_name = "test.txt"

    with db.connect() as conn:
        sales_records = conn.execute(
            "SELECT * FROM sales;"
        ).fetchall()

    if len(sales_records) > 0:
        #for val in sales_records:
            #print(val)
        df = pd.DataFrame(sales_records)
        df.columns = sales_records[0].keys()
        create_file(bucket_name, "sample_files/test.txt", df)
        return "Done!"
    else:
        print("Nothing!")
        return "Nothing!"

def create_file(bucketname, path, records_read):
  storage_client = storage.Client()
  bucket = storage_client.get_bucket(bucketname)
  blob = storage.Blob(
        name=path,
        bucket=bucket,
    )

  content = records_read.to_csv(index=False)#'\n'.join(map(str, records_read))

  blob.upload_from_string(
        data=content,
        content_type='text/plain',
        client=storage_client,
    )

Я соединил это вместе из нескольких фрагментов кода и как не-*- 1007 * разработчик, я почти уверен Есть лучшие способы сделать это. Затем я развернул свою функцию, используя

gcloud deployment-manager deployments  create
0 голосов
/ 18 января 2020
  • Если вам просто нужно l oop вашего списка в Python и записать результаты в файл, вы можете использовать любой из нескольких Python примеров в Интернете или в переполнении стека, например как this one:

    with open('your_file.txt', 'w') as f:
        for item in my_list:
            f.write("%s\n" % item)
    

    Это, конечно, зависит от того, как выглядит ваш список, данных и типа файла, который необходимо записать в облачное хранилище; их необходимо будет заменить в соответствии с вашими потребностями.

  • Для подключения из вашей облачной функции к вашей облачной SQL для PostgreSQL базы данных вы можете следовать документации . Один из примеров использования сокетов SQLAlchemy и Unix:

       db = sqlalchemy.create_engine(
           # Equivalent URL:
           # postgres+pg8000://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432
           sqlalchemy.engine.url.URL(
               drivername='postgres+pg8000',
               username=db_user,
               password=db_pass,
               database=db_name,
               query={
                   'unix_sock': '/cloudsql/{}/.s.PGSQL.5432'.format(
                       cloud_sql_connection_name)
               }
           ),
       )
    

    Где db_user, db_pass и db_name должны быть заменены на имя пользователя, пароль и имя базы данных вашей базы данных.

  • Ссылка , на которую вы ссылались, упоминает о том, как загрузить большой двоичный объект в облачное хранилище, используя Python, как вы, вероятно, знаете, поэтому после извлечения данных из базы данных и записанный в your_file.txt, например, вы можете загрузить его в облачное хранилище с помощью:

    from google.cloud import storage
    
    
    def upload_blob(bucket_name, source_file_name, destination_blob_name):
        """Uploads a file to the bucket."""
        bucket_name = "your-bucket-name"
        source_file_name = "local/path/to/file/your_file.txt"
        destination_blob_name = "storage-object-name"
    
        storage_client = storage.Client()
        bucket = storage_client.bucket(bucket_name)
        blob = bucket.blob(destination_blob_name)
    
        blob.upload_from_filename(source_file_name)
    
        print(
            "File {} uploaded to {}.".format(
                source_file_name, destination_blob_name
            )
        )
    

    Замените your-bucket-name именем вашего хранилища облачного хранилища, local/path/to/file/your_file.txt - локальным путем к вашему файлу. и storage-object-name с именем и расширением, которое вы хотите, чтобы файл имел после загрузки в корзину Cloud Storage.

Собрав все это вместе, вы сможете достичь того, что ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...