如何使用 Google Cloud Functions 和 Python 将列表写入 Google Cloud Sto



我正在尝试使用云函数将列表的成员写入云存储存储桶中的文件中。

我发现此页面显示了如何将文件上传到我的存储桶,但我需要的是遍历列表的成员并将它们写入 Cloud Storage 中的文件。

我需要能够使用Cloud Functions来做到这一点,它从我的Google Cloud SQL数据库中读取。我希望能够将PostreSQL数据库中某些表中的数据存储为云存储中的文件。

谢谢。

  • 如果你只需要在 Python 中循环你的列表并写下结果 到一个文件中,您可以在线使用多个 Python 示例中的任何一个,或者 在堆栈溢出中,例如:

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

    当然,这取决于您的列表的外观,您需要写入Cloud Storage的数据和文件类型; 这些必须根据您的需要进行替换。

  • 从 Cloud Function 连接到 Cloud SQL for PostgreSQL 数据库,您可以按照文档进行操作。一个示例使用SQLAlchemyUnix套接字为:

    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_userdb_passdb_name必须替换为数据库的用户名,密码和数据库的 名字。

  • 你引用的链接提到了如何将 blob 上传到云 您可能知道使用 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替换为 Cloud Storage 存储桶的名称,local/path/to/file/your_file.txt替换为文件的本地路径,storage-object-name替换为您希望文件上传到 Cloud Storage 存储桶后具有的名称和扩展名。

将所有这些放在一起,您可以实现所需的目标。

我设法用以下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,
)

我从多个代码片段中将其拼接在一起,作为非python开发人员,我很确定有更好的方法来完成这项工作。 然后我使用

gcloud deployment-manager deployments  create

相关内容

  • 没有找到相关文章

最新更新