Python 连接到Postgres数据库时出现Apache web服务器分段错误

Python 连接到Postgres数据库时出现Apache web服务器分段错误,python,linux,postgresql,python-2.7,apache,Python,Linux,Postgresql,Python 2.7,Apache,我有一个在apache服务器上运行的python flask web应用程序。flask应用程序只是返回我从postgres数据库获得的值的一个函数 @app.route('/') def hello_world(): import psycopg2 db_conn_string = ("dbname=" + "xxx" + " user=" + "xxx" + " host=" +

我有一个在apache服务器上运行的python flask web应用程序。flask应用程序只是返回我从postgres数据库获得的值的一个函数

@app.route('/')
def hello_world():
    import psycopg2
    db_conn_string = ("dbname=" + "xxx"
                        + " user=" + "xxx"
                        + " host=" + "xxx"
                        + " password=" + "xxx")
    db_connection = psycopg2.connect(db_conn_string)
    cursor = db_connection.cursor()
    cursor.execute("SELECT * FROM XXX")
    return cursor.fetchall()
当我运行此应用程序时,我会在浏览器上看到:

我检查了
/var/log/apache2/error.log下的日志,错误是:

[Fri Jan 24 10:34:34.676561 2020] [core:notice] [pid 15644:tid 139639322680256] AH00051: child pid 15972 exit signal Segmentation fault (11), possible coredump in /etc/apache2
有趣的是,当我将return语句更改为只返回helloworld时,它运行得很好,我没有看到任何错误。因此,我的假设是,错误是由于apache web应用程序试图连接到postgres数据库造成的。我检查了数据库的凭据,没有任何错误。我不知道怎么解决这个问题

EDIT:使用相同代码的测试python程序工作,我能够检索数据。

您的视图(即
hello\u world
函数)需要返回Flask支持的内容。也许可以看一看,以获得更多的例子

最简单的方法是将其转换为字符串并返回,例如:

import psycopg2

@app.route('/')
def hello_world():
    con = psycopg2.connect(db_conn_string)
    with con, con.cursor() as cur:
        cur.execute("SELECT * from xxx;")
        result = cur.fetchall()
    return repr(result)

我重新安排了你的代码,使之更为传统。请注意,
import
s通常位于顶部。您还需要在顶部将连接字符串设置为常量。使用
psycopg2
游标作为上下文管理器也可以很好地将它们包装到事务中,
COMMIT
成功时执行
回滚
异常时执行
回滚

在Python测试程序中运行函数时会得到什么结果?@Bodo Yes,使用相同代码的python程序可以工作,我可以连接到数据库并检索数据。
cursor.fetchall()
返回元组列表。我猜调用函数不准备处理这种结果。@ArchitVerma请回答您的问题,并在那里添加所有信息,而不是在注释中回答。请显示正在工作的Python程序及其输出。@tripleee我认为这不是问题所在。即使尝试从列表中返回一个值,我也会得到相同的错误。谢谢你的回答Sam!我尝试从列表中只返回一个值,但没有帮助。我不认为问题在于Flask无法理解return语句。如果在Apache之外运行Flask怎么办?i、 e.只需在教程中使用它就可以了。代码本身似乎没有问题。不知何故,当我在apache服务器上运行它时,它会给我一个分段错误。然后可能让apache输出更多的日志信息,以找出实际失败的地方/原因。可能会更新问题以包括相关的配置设置