gpt4 book ai didi

python - 从 MySQL 迁移到 Postgres 后了解 "SEPARATOR"处或附近的语法错误

转载 作者:行者123 更新时间:2023-11-29 11:38:48 25 4
gpt4 key购买 nike

我最近不得不彻底修改一个最初使用 MySQL 的 Django 项目,但为了部署到 Heroku(按照他们在 docs regarding Django deployment 中的建议),我通过以下方法将 MySQL 数据库迁移到 Postgres:

  1. 安装的依赖项:pyscopg2py-mysql2pgsql

  2. 设置 Postgres 数据库

  3. 迁移的数据库:$ py-mysql2pgsql — 这会创建一个 mysql2pgsql.yml 文件,如下所示:

    mysql:
    主机名:本地主机
    端口:3306
    套接字:/tmp/mysql.sock
    用户名: foo
    密码: 吧
    数据库:your_database_name
    压缩:假
    目的地:
    postgres:
    主机名:本地主机
    端口:5432
    用户名: foo
    密码: 吧
    数据库:your_database_name

  4. 通过以下方式传输数据:$ py-mysql2pgsql -v -f mysql2pgsql.yml

喝了很多杯咖啡后,到 Heroku 的部署成功了(在很大程度上,直到我今天发现这个问题),并且当我运行 $ heroku local 时,该应用程序在 Heroku 上按预期工作。但是今天访问前端某个功能时,浏览器出现数据库错误:

DatabaseError at /projects/

syntax error at or near "SEPARATOR"
LINE 1: ...s, sc.name as sport_category, string_agg(au.email SEPARATOR ...
^

Request Method: GET
Request URL: http://0.0.0.0:8989/projects/
Django Version: 1.5.1
Exception Type: DatabaseError
Exception Value:

syntax error at or near "SEPARATOR"
LINE 1: ...s, sc.name as sport_category, string_agg(au.email SEPARATOR ...

我相信相关代码位于名为business.py的文件中:

def getAllProjects(self):
'''
@note: Retrieve all projects
'''

from django.db import connection
cursor = connection.cursor()

cursor.execute("select p.id, p.title, p.description, p.deadline, pt.name as project_type, s.name as status, sc.name as sport_category, group_concat(au.email SEPARATOR '\n') as project_managers from project p left join project_manager_in_project pmip on p.id = pmip.project_id left join auth_user au on pmip.project_manager_id = au.id inner join project_type pt on p.projectType_id = pt.id inner join status s on p.status_id = s.id inner join sport_category sc on p.sportCategory_id = sc.id where p.deleted = 0 group by p.id")
projects = cursor.fetchall()
return projects

我知道一些讨论类似问题的帖子:

Postgresql - concat_ws like function?

Postgresql GROUP_CONCAT equivalent?

这导致我尝试将 group_concat(au.email SEPARATOR '\n') 更改为 string_agg(au.email SEPARATOR '\n') ,然后 array_agg(au.email SEPARATOR '\n') 但我仍然收到相同的错误。

是否有另一种方法可以解决这个问题并调整此函数以实现解决方法?

更新:对于任何感兴趣的人,下面“考虑我”提供的选定答案(和评论)使我得到了以下更改后的查询语句,到目前为止该语句没有任何问题:

cursor.execute("select \"project\".\"id\", project.title, project.description, \"project\".\"deadline\", \"pt\".\"name\" as \"project_type\", \"sc\".\"name\" as status, \"sc\".\"name\" as sport_category, string_agg(au.email, E'\n') as project_managers from project left join project_manager_in_project pmip on project.id = pmip.project_id left join auth_user au on pmip.project_manager_id = au.id inner join project_type pt on project.\"projectType_id\" = pt.id inner join status s on project.\"status_id\" = \"s\".id inner join sport_category sc on \"project\".\"sportCategory_id\" = \"sc\".\"id\" where project.deleted = 0 group by 1,2,3,4,5,6,7")

由于该应用程序的原始开发人员创建了所有带有双引号的表格,这导致了列 p.projecttype_id 不存在错误以及其他类似的不存在 当我所做的一切被删除SEPARATOR并将group_concat(两者都不存在于Postgres中)更改为string_agg时,我不断收到错误。换句话说,根据“考虑我”的建议,我必须用双引号封装几乎所有的表和列名称(当然还要转义引号)。

最佳答案

正如您已经看到的,您需要将 GROUP_CONCAT() 替换为 STRING_AGG()。在 GROUP BY 子句中包含聚合函数内未使用的每一列。

select 
p.id,
p.title,
p.description,
p.deadline,
pt.name as project_type,
s.name as status,
sc.name as sport_category,
string_agg(au.email, E'\n') as project_managers
from
project p
left join project_manager_in_project pmip on p.id = pmip.project_id
left join auth_user au on pmip.project_manager_id = au.id
inner join project_type pt on p.projectType_id = pt.id
inner join status s on p.status_id = s.id
inner join sport_category sc on p.sportCategory_id = sc.id
where
p.deleted = 0
group by 1,2,3,4,5,6,7

Postgres 中没有 SEPARATOR 关键字(至少我不知道它的存在)。

关于python - 从 MySQL 迁移到 Postgres 后了解 "SEPARATOR"处或附近的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36165609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com