Первая часть работает правильно. ; файлы сохраняются в том же каталоге, что и основной файл Python.
При вызове методов sqlalchemy (в частности, create_engine() )
a ModuleNotFoundError: ни один модуль с именем «pyodbc» не создается.
(
Код: Выделить всё
return __import__('pyodbc')
Когда я пытаюсь конкретно импортировать pyodbc, выдается та же ошибка ModuleNotFoundError.
Код отлично работает локально на моей машине.
Я указал путь к модулям в коде, таким образом загружается SQLAlchemy (и другие модули, например фидпарсер).
Я установил модули через консоль Kudu, следуя этому руководству:
(tl;dr make venv и установите с помощью pip)
https://github.com/yokawasa /azure-functions-python-samples/blob/master/docs/install-python-modules.md
ОС хост-компьютера: Версия ОС: Microsoft Windows NT 10.0.14393.0
64-разрядная система
Код: Выделить всё
# -*- coding: utf-8 -*-
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname( __file__ ), 'env/Lib/site-packages')))
from ftplib import FTP
from ast import literal_eval
import csv
import json
from sqlalchemy import create_engine, MetaData, Table
import pyodbc
def post_processing(input, output, csv_counter, header):
'''Removes uneccessary headers from the csv files and writes the data
into a csv file'''
# code...
return csv_counter, header
def download():
# first gets all the dates as the base for the full paths
# afterwards build each possible path to a csv file
# structure or dimensions of folders has to be known in advance
# advantage: specific folders are not hardcoded
# code...
return response
def upload():
postreqdata = json.loads(open(os.environ['req']).read())
response = open(os.environ['res'], 'w')
response.write("Finito" + postreqdata["name"])
response.close()
try:
# dev settings
f = open("connection\\con_info_sink.txt", "r")
connection_info = literal_eval(f.read())
f.close()
except FileNotFoundError:
# prod settings
connection_info = {
"db_user": os.environ["DB_USER"],
"db_password": os.environ["DB_PASSWORD"],
"db_name": os.environ["DB_NAME"],
"db_host": os.environ["DB_HOST"],
}
engine = create_engine(
"mssql+pyodbc://{db_user}:{db_password}@{db_host}/{db_name} ?driver=ODBC+Driver+13+for+SQL+Server".format(**connection_info), convert_unicode=True)
# orm mapping
metadata = MetaData(engine)
pcards = Table("pcardlog", metadata, autoload=True, schema='staging')
col_names_pcard = pcards.columns.keys()
fakedata_pcard = []
with open('source.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=';')
for row in reader:
fakedata_pcard.append(
{col_names_pcard[0]: row[0],
col_names_pcard[1]: row[1],
col_names_pcard[2]: row[2],
col_names_pcard[3]: row[3],
col_names_pcard[4]: row[4],
col_names_pcard[5]: row[5],
col_names_pcard[6]: row[6],
})
con = engine.connect()
con.execute(pcards.insert(), fakedata_pcard)
return response
if __name__ == "__main__":
response = download()
response = upload()
Я тоже пробовал установить pyodbc в этом проекте с Wheelhouse, но это ничего не изменило.
Обновление 1:
Я нашел сообщение на Stackoverflow, в котором говорится, что установка пользовательских драйверов невозможна в приложениях функций Azure.
Драйверы баз данных ODBC или OleDB в Службе приложений Azure
Обновление 2: после наткнулся на проблему GitHub для интерфейса функций Azure
https://github.com/Azure/azure-function ... -452478272
и попробовал развернуть функцию в среде Linux с наконец-то загруженными docker и pyodbc
. Однако спецификация драйвера для SQLAlchemy теперь неверна.
Я разверну эту функцию в веб-приложении Azure, поскольку знаю, что она там будет работать.
Функции Azure с Python находится в предварительной версии, поэтому функциональность может измениться в будущем.
Подробнее здесь: https://stackoverflow.com/questions/540 ... fully-inst