mysql的separator_从MySQL迁移到Postgres后,了解“ SEPARATOR”处或附近的语法错误

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

安装的依赖项:pyscopg2和py-mysql2pgsql

设置Postgres数据库

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

mysql:

hostname: localhost

port: 3306

socket: /tmp/mysql.sock

username: foo

password: bar

database: your_database_name

compress: false

destination:

postgres:

hostname: localhost

port: 5432

username: foo

password: bar

database: your_database_name

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

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

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

我知道一些有关类似问题的文章:

这导致我尝试更改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")

由于该应用程序的原始开发人员创建了所有带有双引号的表,因此导致column p.projecttype_id does not exist错误和其他类似的does not exist错误(在我所做的所有操作都删除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

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

SEPARATORMySQL 中 GROUP_CONCAT 函数的一个参数。它用于指定在连接多个值时所使用的分隔符。在 GROUP_CONCAT 函数中,可以通过 SEPARATOR 参数来指定连接结果的分隔符。比如,可以使用 SEPARATOR ';' 来将多个值用分号进行连接。 例如,在下面这个示例中,我们使用 GROUP_CONCAT 函数连接了 TBL_SCORE 表中每个用户的分数,并使用分号作为分隔符: SELECT USERID, GROUP_CONCAT(SCORE ORDER BY USERID SEPARATOR ';') AS SCORE FROM TBL_SCORE GROUP BY USERID; 这样查询的结果将会以分号分隔的形式返回,并且每个用户的分数将会在一行中显示。SEPARATOR 参数非常有用,特别是在需要将多个值连接成一个字符串时。需要注意的是,在使用 GROUP_CONCAT 函数时,通常需要结合 GROUP BY 子句来指定按照哪个字段进行分组。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [mysql如何实现多行查询结果合并成一行](https://download.csdn.net/download/weixin_38538021/14835326)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL中GROUP_CONCAT函数的使用,separator,将多行查询结果用特定字符串连接起来,适用于一对多](https://blog.csdn.net/leiliz/article/details/54927420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值