2016-03-22 37 views
0

最近、もともとMySQLを使用していたDjangoプロジェクトをオーバーホールする必要がありましたが、Herokuにデプロイするために(docs regarding Django deploymentの推奨に従って)以下の方法を経由してのPostgresへのMySQLデータベース:MySQLからPostgresへの移行後の構文エラーの理解

  1. インストールの依存関係:pyscopg2py-mysql2pgsql

  2. セットアップPostgresデータベース

  3. 移行されたデータベース: - :

    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

  4. を介してデータを転送:コーヒーの多く杯後$ py-mysql2pgsql -v -f mysql2pgsql.yml

、展開に$ py-mysql2pgsqlが、これはこのようになりますmysql2pgsql.ymlファイルを作成します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 

私は同様の問題について話をいくつかの記事を承知している:

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')に変更しようとしましたが、まだ同じエラーが発生しています。

これにアプローチしてこの機能を調整して回避策を適用する別の方法がありますか?

UPDATE:興味があるのです、誰のために、下記の私を考えてみましょにより提供される選択された解答(とコメント)は、これまで問題なく動作します以下の変更されたクエリステートメントに私を導いた:として

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") 

をこのアプリケーションの元の開発者は二重引用符ですべてのテーブルを作成しました。これは、エラーと他の同様のdoes not existエラーをもたらしました。言い換えると、Consider Meの提案によれば、私は二重引用符で表と列の名前をすべてカプセル化しなければなりませんでした(もちろん引用符をエスケープします)。

答えて

1

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キーワードは、(少なくとも私はその存在を認識していないよ)はありません。

+0

ありがとうございます。このページをロードしようとすると、ブラウザに次のエラーメッセージが表示されます。 'p.projecttype_id列が存在しません。 LINE 2:..._ manager_id = au.id p.projectT ... ptの内部結合project_type pt – AdjunctProfessorFalcon

+0

エラーはかなり簡単です。 (テーブルプロジェクトのprojecttype_id) –

+0

'project'テーブルに' projectType_id'カラム(Integer型)があることを除いて、混乱します。 – AdjunctProfessorFalcon

関連する問題