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 причину этой проблемы и устранить ее. Благодарим вас за помощь.
Спасибо.