首页 > 解决方案 > Python异步写入数据库

问题描述

我正在尝试从 Dialogflow Fulfillment 写入 Cloud SQL (MySQL)。后端托管在 App Engine 中,我正在使用公共 IP 访问 Cloud SQL(其他应用程序也使用相同的数据库,因此我目前没有使用私有 IP 的选项)。基本上一切正常,但写入数据库所需的时间比允许的会话时间长,所以我在 Dialogflow 上收到 DEADLINE_EXCEEDED 错误。

问题是我不需要等待数据写入数据库。所以我想知道是否可以使用一些异步技巧来处理写入过程。

例如:

.
.
.
# Take input from users.
# Save them in variables.
# Make a JSON file

write_to_db(JSON_file)
# Don't wait for the response from the above funciton
.
.
.
# Continue with the rest and return if necessary

有没有办法在python中实现这一点?

编辑

写入 Cloud SQL 的代码。

import sqlalchemy
import logging
import os

connection_name = ""
db_name = ""
db_user = ""
db_password = ""
driver_name = 'mysql+pymysql'
query_string = dict({"unix_socket": "/cloudsql/{}".format(connection_name)})

.
.
.
def insert_reservation():
    REST_ID = "0010"
    RESV_ID = "0020"
    RESV_DT = "12082020"
    USER_ID = "1234"
    RESV_TM = "1040"
    RESV_PERSON_NU = "4"
    USER_COMMENT = "some Comment"
    stmt = sqlalchemy.text("INSERT INTO table_name (REST_ID, RESV_ID, RESV_DT, USER_ID, RESV_TM, RESV_PERSON_NU, USER_COMMENT) values ('{}', '{}', '{}', '{}', '{}', '{}', '{}');".format(
        REST_ID,
        RESV_ID, 
        USER_ID,
        RESV_DT,
        RESV_TM,
        RESV_PERSON_NU,
        USER_COMMENT
    ))
    db = sqlalchemy.create_engine(
      sqlalchemy.engine.url.URL(
          drivername=driver_name,
          username=db_user,
          password=db_password,
          database=db_name,
          query=query_string,
      ),
      pool_size=5,
      max_overflow=2,
      pool_timeout=30,
      pool_recycle=1800
    )
    try:
        with db.connect() as conn:
            conn.execute(stmt)
    except Exception as e:
        logging.info("SQL Error: {}".format(str(e)))
        #return 'Error: {}'.format(str(e))
    
    return 'ok'
.
.
.

如前所述,这可以正常工作,但唯一的问题是速度很慢。有什么建议可以提高速度或交给另一个线程来处理吗?

标签: pythonmultithreadingasynchronousgoogle-cloud-platformdialogflow-es

解决方案


推荐阅读