SQLAlchemy create_engine не работает в облачной функции Google

#python #mysql #google-cloud-platform #sqlalchemy #google-cloud-functions

# #python #mysql #google-облачная платформа #sqlalchemy #google-cloud-функции

Вопрос:

Я пытаюсь запустить облачную функцию Google, которая собирает данные с веб-сайта, а затем вставляет их в облачную базу данных SQL (MySQL), но у меня проблемы с SQLAlchemy в облаке, которые не отображаются на моем локальном компьютере. Есть предложения !?

Когда я запускаю функцию локально, на Py3.7 (на Mac, без использования virtualenv), используя облачный SQL-прокси и SQLAlchemy, я успешно подключаюсь к базе данных.

При запуске облачной функции я использую строку подключения в этом формате mysql pymysql://<username>:<password>/<dbname>?unix_socket=/cloudsql/<PROJECT-NAME>:<INSTANCE-REGION>:<INSTANCE-NAME> .

Облачная функция продолжает выдавать следующее исключение для SQLAlchemy.create_engine. Похоже, это связано не с возможностью подключения, а с созданием экземпляра.

Все находится в одном проекте.

Я также пытался использовать общедоступный IP-адрес и строку подключения в формате mysql pymysql://<username>:<password>@<public ip address>:3306/<dbname> , что не имело никакого значения.

 Traceback (most recent call last):
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker_v2.py", line 449, in run_background_function
    _function_handler.invoke_user_function(event_object)
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker_v2.py", line 268, in invoke_user_function
    return call_user_function(request_or_event)
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker_v2.py", line 265, in call_user_function
    event_context.Context(**request_or_event.context))
  File "/user_code/main.py", line 14, in retrieve_and_log
    engine = create_engine(connection_string,echo=True)
  File "/env/local/lib/python3.7/site-packages/sqlalchemy/engine/__init__.py", line 500, in create_engine
    return strategy.create(*args, **kwargs)
  File "/env/local/lib/python3.7/site-packages/sqlalchemy/engine/strategies.py", line 56, in create
    plugins = u._instantiate_plugins(kwargs)
AttributeError: 'Context' object has no attribute '_instantiate_plugins'
 

Вот фрагмент моего кода:

 import requests
from bs4 import BeautifulSoup
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String

def retrieve_and_log(store_string, connection_string = 'mysql pymysql://<username>:<password>/<dbname>?unix_socket=/cloudsql/<PROJECT-NAME>:<INSTANCE-REGION>:<INSTANCE-NAME>'):

    engine = create_engine(connection_string,echo=True)
    
    conn = engine.connect()
    # ....


 

Комментарии:

1. Это также происходит, если вы используете конструктор строк подключения SQLAlchemy, который используется в документации ?

2. @RafaelLemos, да, это все еще происходило. Ответ Дастина сделал свое дело.

Ответ №1:

Если retrieve_and_log это функция, которую вы пытаетесь развернуть в качестве фоновой облачной функции, для нее требуется подпись, например:

 def retrieve_and_log(data, context):
    ...
 

Он не может принимать произвольные параметры.

См https://cloud.google.com/functions/docs/writing/background для получения более подробной информации.

Комментарии:

1. Отлично, рад это слышать! Не забудьте отметить ответ как принятый.