【问题标题】:flask sqlalchemy keeps Postgres transaction idleflask sqlalchemy 使 Postgres 事务保持空闲
【发布时间】:2014-03-23 00:47:57
【问题描述】:

我正在使用 flaskrestful、sqlalchemy、Postgres、nginx、uwsgi 编写一个烧瓶 api。我是 python 的新手。这些是我的配置

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,然后使用锅炉管道保存网站的所有内容。想法是稍后移动到队列

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 时,它显示状态“事务中的空闲”。该应用程序挂起,然后我必须重新启动服务器。我不明白为什么 session.close() 不关闭池连接为什么它保持 psql 事务状态忙。伙计们,我们将不胜感激。

【问题讨论】:

  • 嗯,生产环境和本地开发环境在配置或版本上有什么不同吗?
  • 除了我在本地和生产中使用的服务器之外,其他所有内容都相同
  • 嗯,有些东西必须有所不同,无论是包版本、环境变量、配置文件、网络设置的差异等等。要准确追踪是什么,您可能必须逐步完成此操作并比较它在每一步中的作用。我不认为这是 Stack Overflow 可以真正提供帮助的事情。

标签: python api postgresql sqlalchemy flask


【解决方案1】:

您在会话结束前返回:

  return "Data created "
  session.close()

我认为最终返回内部也可能会吞下异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2010-11-20
    • 2013-10-15
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多