我是一个新手,正在使用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事务状态保持繁忙。各位大佬有任何帮助将不胜感激。