Flask SQLAlchemy 使 Postgres 事务保持空闲状态。

3

我是一个新手,正在使用flaskrestful、sqlalchemy、Postgres、nginx和uwsgi编写flask API。以下是我的配置:

database.py

from cuewords import app
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.pool import NullPool
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String , Text , Boolean , DateTime, MetaData, Table ,Sequence
from sqlalchemy.dialects.postgresql import JSON


 Base = declarative_base()
 db_name="postgresql+psycopg2://admin:password@localhost:5434/database_name"
 from sqlalchemy.orm import sessionmaker
 engine = create_engine(db_name,poolclass=NullPool ,echo=True)
 Session = sessionmaker(autocommit=False ,bind=engine)
 connection = engine.connect()
 metadata = MetaData()

api.py

   class Webcontent(Resource):

    def post(self):
    session=Session()
    ...assign some params...
    try:
      insert_data=Websitecontent(site_url,publisher_id)
      session.add(insert_data)
      session.commit()
      Websitecontent.update_url(insert_data.id,session)
    except:
      session.rollback()
      raise
    finally:
      return "Data created "
      session.close()                
  else:  
    return "some value"

我将首先只保存URL,然后使用Boilerpipe保存网站的所有内容。这个想法是稍后转移到队列中。

model.py

 class Websitecontent(Base):

  @classmethod
  def update_url(self,id,session):
  existing_record=session.query(Websitecontent).filter_by(id=int(id)).first()
  data=Processing.processingContent(str(existing_record.url))

  #boilerpipe processing the content here
  #assigning some data to existing record in session 

  session.add(existing_record)
  session.commit()
  Websitecontent.processingWords(existing_record,session)

  @classmethod
  def processingWords(self,record,session)
    ...processing
    Websitecontent.saveKeywordMapping(session,keyword_url,record)

  @classmethod
  def saveKeywordMapping(session,keyword_url,record)
   session.commit()
   session.close()

这段代码在本地环境中运行完美,但在生产环境中却无法正常工作。当我检查pag_stat_activity时,发现状态为“idle in transaction”。应用程序停顿,然后我必须重启服务器。我不明白为什么session.close()没有关闭池连接,为什么它会让psql事务状态保持繁忙。各位大佬有任何帮助将不胜感激。


在生产环境和本地开发环境之间的配置或版本上有区别吗? - Craig Ringer
除了我在本地和生产中使用的服务器不同之外,一切都相同。 - shiva
嗯,一定会有些不同的地方,可能是软件包版本、环境变量、配置文件、网络设置差异等等。要准确追踪问题所在,你可能需要逐步比较每个步骤的差异。我认为这不是 Stack Overflow 能够真正帮助解决的问题。 - Craig Ringer
1个回答

2
您在关闭会话之前返回了:

您在关闭会话之前返回了:

  return "Data created "
  session.close()

我认为在finally中使用return语句可能会导致异常被忽略。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接