#python #postgresql #azure-functions #azureservicebus
Вопрос:
У меня есть функция Python, и я развернул ее в Azure Funtion. Я использовал TXT-файл для хранения времени, и я буду его использовать. На локальном компьютере эта функция выполняется без проблем. Но я получил приведенную ниже ошибку при запуске в Azure:
Result: Failure Exception: OSError: [Errno 30] Read-only file system: 'date_time.txt' Stack:
В своем поиске я нахожу некоторые решения, такие как TempFile, но мне нужно значение date_time.txt на следующий раз.
Мой код:
import os
import psycopg2
import datetime
import logging
import tempfile
import pandas as pd
import json
import sqlalchemy
from azure.servicebus import ServiceBusClient, ServiceBusMessage
import azure.functions as func
connstr = "****"
topic_name = "***"
subscription_name = "***"
def get_engine(database='portal_rms', username='***', password='**', host='***', port=5432):
engine_string = f"postgresql psycopg2://{username}:{password}@{host}:{port}/{database}"
engine = sqlalchemy.create_engine(engine_string)
return engine
def read_from_db(table_name, date_time):
acceleration_array = []
engine = get_engine()
connection = engine.connect()
metadata = sqlalchemy.MetaData()
pinconnector_attacheddevicelogdata = sqlalchemy.Table(
table_name, metadata, autoload=True, autoload_with=engine)
query = sqlalchemy.select([pinconnector_attacheddevicelogdata]).where(pinconnector_attacheddevicelogdata.columns.capture_time > date_time)
.order_by(pinconnector_attacheddevicelogdata.columns.capture_time).limit(100)
ResultProxy = connection.execute(query)
ResultSet = ResultProxy.fetchall()
engine.dispose()
return ResultSet
def get_date_time(date_time_string):
[date, time] = date_time_string.split(" ")
[year, month, day] = date.split("-")
[hour, minute, second] = time.split(":")
[second, microsecond] = second.split(".")
[year, month, day, hour, minute, second, microsecond] = list(
map(lambda x: int(x), [year, month, day, hour, minute, second, microsecond]))
return datetime.datetime(year, month, day, hour, minute, second, microsecond, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None))
def write_date_time(date_time, address="date_time.txt"):
file1 = open(address, "w ")
file1.write((str(date_time)).split(" ")[0])
file1.close()
def read_date_time(address="date_time.txt"):
file1 = open(address, "r")
date_time = file1.readline()
date_time = get_date_time(date_time)
file1.close()
return date_time
def get_query_latest_date_time(db_query, date_time):
for item in db_query:
if item["capture_time"] > date_time:
date_time = item["capture_time"]
return date_time
def transform(query_row):
query_row = dict(query_row)
for item in ['capture_time', 'received_time', 'read_time']:
query_row[item] = str(query_row[item]).split(" ")[0]
return query_row
date_time = read_date_time()
db_query = read_from_db("pinconnector_attacheddevicelogdata", date_time)
write_date_time(db_query[-1]["capture_time"])
# print(db_query)
#data_send = json.dumps(db_query)
data_send = json.dumps(list(map(lambda x: transform(x), db_query)))
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_topic_sender(topic_name) as sender:
sender.send_messages(ServiceBusMessage(data_send))
Комментарии:
1. Не пытайтесь использовать файловую систему в функции Azure. Нет никакой гарантии, что один и тот же сервер будет использоваться для выполнения вашей функции при двух последовательных запусках, поэтому, даже если вы сможете выполнить запись в файловую систему, вы можете обнаружить, что при последующих запусках файла там не будет. Если вам нужно сохранить состояние между запусками функции, сохраните его в другом месте, например, в хранилище Azure.
Ответ №1:
Причиной может быть несовместимая версия операционной системы. Пожалуйста, рассмотрите в этом случае пользовательский контейнер.
Вы также можете обратиться к этой аналогичной проблеме : https://docs.microsoft.com/en-us/answers/questions/67126/failure-exception-oserror-errno-30-read-only-file.html