Flask Web App:(psycopg2.OperationalError)服务器意外关闭了连接

时间:2017-09-11 20:30:33

标签: python postgresql azure flask flask-sqlalchemy

我在Azure上有一个小应用程序,它作为具有以下特征的Web应用程序运行:

  1. Python(带有SQLAlchemy的Flask)
  2. 的PostgreSQL
  3. 我试图通过SQLAlchemy从我的python代码创建一个表。这是我的文件夹结构:

    project structure

    这是我的Exception (Database Exception) 'yii\db\Exception' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 index investmo_index: parse error: SNIPPET() requires 2 arguments The SQL being executed was: SELECT *, SNIPPET(title, 'test', 'before_match=<mark>', 'after_match=</mark>') AS _title, SNIPPET(header, 'test', 'before_match=<mark>', 'after_match=</mark>') AS _header, SNIPPET(content, 'test', 'before_match=<mark>', 'after_match=</mark>') AS _content FROM `investmo_index` WHERE MATCH('test')' 文件:

    __init__.py

    然后我有我的index.py文件:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    POSTGRES = {
        'user': 'admin_user@pracap',
        'pw': 'password_goes_here',
        'db': 'apitest',
        'host': 'pracap.postgres.database.azure.com',
        'port': '5432',
    }
    URL = 'postgresql://%(user)s:\%(pw)s@%(host)s:%(port)s/%(db)s' % POSTGRES
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = URL
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db = SQLAlchemy(app)
    
    import apitestproject.index
    

    这是我的usermodel文件:

    from flask import Flask
    from flask_restful import Api
    from apitestproject import app, db
    
    
    @app.before_first_request
    def create_tables():
        db.create_all()
    
    @app.route('/')
    @app.route('/home')
    def home():
        return "I'm the default route"
    

    当我运行我的项目时,我收到以下错误:

    from ..apitestproject import db
    
    class UserModel(db.Model):
        __tablename__ = 'users'
    
        id = db.column(db.string, primary_key=True)
        name = db.column(db.string(50))
        address = db.column(db.string(144))
        salary = db.column(db.numeric(12, 2))
        position = db.column(db.string(50))
        password = db.column(db.string(50))
    

    我已经从Azure中禁用了requiredSSL,仅用于测试目的,并允许来自防火墙上每个IP的连接,如MSFT教程中所示。

    之前有人遇到此错误吗?

1 个答案:

答案 0 :(得分:0)

根据我的经验,我认为问题是由psycopg2使用连接字符串postgresql://user:password@hostname:port/dbname引起的。要使用psycopg2,您需要使用Python中的连接字符串作为下面的代码,请参阅官方文档here

import psycopg2

# Update connection string information obtained from the portal
host = "mypgserver-20170401.postgres.database.azure.com"
user = "mylogin@mypgserver-20170401"
dbname = "mypgsqldb"
password = "<server_admin_password>"
sslmode = "require"

# Construct connection string
conn_string = "host={0} user={1} dbname={2} password={3} sslmode={4}".format(host, user, dbname, password, sslmode)
conn = psycopg2.connect(conn_string) 
print "Connection established"

还有一个SO线程Can't Figure Out DB URI Postgres Azure,它解释了使用Python在Azure上连接PostgreSQL的一些问题。

希望它有所帮助。