Flask приложение работает на uwsgi и nginx падает с SQL Ошибка транзакции сервера - PullRequest
0 голосов
/ 10 апреля 2020

Python: 3.5.2 pyodb c: 4.0.28 ОС: Ubuntu 18.04 БД: Microsoft SQL Драйвер сервера: ODB C Драйвер 17 для SQL Сервер WSGI: uwsgi & nginx

Проблема: Ошибка нажатия SQL Сервер Не удалось возобновить транзакцию для Flask веб-приложения, производственного сервера.

Описание: I ' я работаю над Python Flask веб-приложением, которое работает на Ubuntu и MS SQL Server, для которого я использую pyodb c и SQLAlchemy для соединения с базой данных и обработки запросов. В коде много транзакций базы данных, в основном SELECT, UPDATE, INSERT. Приложение работает нормально, когда я запускаю его на локальном сервере и в командном режиме uwsgi без каких-либо проблем. Но когда я запускаю веб-сервер, настроенный на uwsgi и nginx, я постоянно получаю сообщение об ошибке

(pyodb c .ProgrammingError) ('42000', '[42000 ] [Microsoft] [ODB C Драйвер 17 для SQL Сервер] [SQL Сервер Не удалось возобновить транзакцию.]

Я несколько раз менял код, использовал сеансы в SQLAlchemy , изменил конфигурацию nginx, но независимо от того, что я делаю, кажется, ничего не работает, и я вернулся к этой ошибке. Я не мог понять, если это проблема с моим кодом или ошибка в pyodb c. Несколько фрагментов кода ниже,

Конфигурация базы данных:

# Database Configurations #
engine = create_engine("mssql+pyodbc://sa:********@0.0.0.0/WDM?driver=ODBC+Driver+17+for+SQL+Server",
                       echo=False, isolation_level="SERIALIZABLE", strategy='threadlocal')
Base = declarative_base(bind=engine)
Session = sessionmaker(bind=engine, autocommit=True, expire_on_commit=True, autoflush=True)
sc_ss = scoped_session(Session)
db_session = Session()
connection = db_session.bind

Получить данные:

with db_session.bind as c9:
    states = pd.read_sql("select distinct a.StateID, a.statename from DeskStateMaster a, DeskUnitRegistration b "
                         "where a.StateID = b.StateID", c9)
    states = states.to_dict('records')

Flask пример маршрута:

# Set Master Values #
@app.route('/set_master_data', methods=["GET","POST"])
def set_master_data():
    logged_user = str(session["username"]).capitalize()
    with db_session.bind as c9:
        master_data = pd.read_sql("select ID,ParameterName,ParameterLowValue,ParameterHighValue from DeskMasterData", c9)

    if request.method == "POST":
        # master_data = pd.read_sql("select ID,ParameterName,ParameterLowValue,ParameterHighValue from TestMasterData", engine)

        updates = []
        for key,value in master_data["ParameterName"].iteritems():
            updates.append({
                "ParameterName": value,
                "ParameterLowValue": request.form.get(str(value + " " + "Low")),
                "ParameterHighValue": request.form.get(str(value + " " + "High")) })

        df = pd.DataFrame(updates)
        for i in range(0, df.__len__()):
            with db_session.bind as c9:
                c9.execute("update DeskMasterData set ParameterLowValue={low}, ParameterHighValue={high} "
                           "where ParameterName = '{parameter}' ".format(
                parameter=df.iloc[i].ParameterName,
                low=float(df.iloc[i].ParameterLowValue),
                high=float(df.iloc[i].ParameterHighValue) ))
        if updates:
            message = "Master Values Updated"
        else:
            message = ""
        master_data = pd.DataFrame()
        return render_template('set_master_data.html', masterValues = master_data, message=message,
                               logged_user=logged_user)

    return render_template('set_master_data.html', masterValues = master_data, message="", logged_user=logged_user)

Пожалуйста, помогите мне найти root причину этой проблемы и устранить ее. Благодарим вас за помощь.

Спасибо.

...