PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 12/05/2017 12:42:00

\copy sur linux et sur windows

Bonjour;

J'ai un script export_csv.sql qui contient des commandes \copy ... afin de produire des csv.

Quand je joue ce script sur Linux, tout va bien.

Mais quand je le joue sur Windows; je reçois le message :

psql:export_csv.sql:1: invalid command : \
psql:export_csv.sql:1: ERROR : syntax error at or near "y_"
LINE 1: "y_"

Il s'agit d'un y avec deux points dessus.

Mais si je copy/paste la ligne du fichier sql en psql, la commande s'éxecute sans problème.

Que faire ?

Merci pour votre attention

Hors ligne

#2 12/05/2017 12:58:36

rjuju
Administrateur

Re : \copy sur linux et sur windows

Peut-être un problème entre le format des fichiers linux et windows. Pouvez-vous essayer de convertir votre script avec unix2dos avant de l'exécuter ? Ou alors un problème de BOM / utfX ? Quel est l'encodage utilisé pour le fichier ?

En ligne

#3 12/05/2017 14:20:16

Re : \copy sur linux et sur windows

Merci pour votre réponse

C'est un script que j'ai généré par un script en VBA :

Option Compare Database
Private Sub sync_local_data_to_server_Click()
    Dim rs As DAO.Recordset
    Dim fso As Object
    Dim date_today As String
    Dim path4csv As String
    Dim path4psql As String
    Dim export_csv_file As Object
    Dim stmt As String
    Dim hProcess As Long
    Dim user2sync As String
     
    path4csv = "D:\Users\Ariel\sync\files2send\"
    path4psql = "C:\Programs\PostgreSQL\9.5\bin\"
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    user2sync = Forms("send_sync2server")!user2sync
    
    '
    ' delete old export_csv.sql
    '
    With fso
        If .FileExists(path4csv & "export_csv.sql") Then
            .DeleteFile path4csv & "export_csv.sql"
        End If
    End With
    
    '
    ' create new export_csv.sql
    '
    Set export_csv_file = fso.CreateTextFile(path4csv & "export_csv.sql", True, True)
         
    '
    ' write line for audit_history
    '
    stmt = "\copy (select table_name, operation, audit_id, user_name, audit_date, sync_status from public.audit_history) to '" _
                & path4csv _
                & "audit_history.csv' with csv header;"
                
    export_csv_file.WriteLine stmt
    export_csv_file.WriteLine ""
            
    '
    ' write lines for tables
    '
    Set rs = CurrentDb.OpenRecordset("select distinct table_name from audit_history")
                
    If Not (rs.EOF And rs.BOF) Then
    
        rs.MoveFirst
        
        Do Until rs.EOF = True
            
            stmt = "\copy (select * from " _
                    & Chr(34) _
                    & rs!table_name _
                    & Chr(34) _
                    & " ) where audit_id in (select audit_id from public.audit_history where table_name = " _
                    & "'" _
                    & rs!table_name _
                    & "'" _
                    & ")) to '" _
                    & path4csv _
                    & rs!table_name _
                    & ".csv' with csv header;"
                    
            export_csv_file.WriteLine stmt
            export_csv_file.WriteLine ""
              
            rs.MoveNext
            
        Loop
    
    End If
    
    export_csv_file.Close
        
    '
    ' call pg to run to export_csv.sql
    '
    stmt = Chr(34) & path4psql & "psql -U rubin " & " -f " & path4csv & "export_csv.sql" & " contacts" & Chr(34)
    MsgBox (stmt)
    hProcess = Shell(stmt, vbNormalFocus)
    
    
    MsgBox ("Sync files produced")
    '
    ' send the csv's to pg server
    '
    'fso.CopyFile path4csv & "*.csv", "\\192.168.1.160\sync\" & user2sync & "\"
    
    fso.CopyFile path4csv & "*.csv", "Z:\" & user2sync & "\"
    
End Sub

Ce qui est étonnant, c'est que les commandes qui sont dans le fichier, je peux les exécuter en les copy/paste dans psql. Mais elles donnent un message d'horreur quand je cherche à les exécuter par -f export_csv.sql ou \i export_csv.sql.
J'en perds mon latin

Hors ligne

#4 12/05/2017 14:52:23

Re : \copy sur linux et sur windows

Résolu !

Set export_csv_file = fso.CreateTextFile(path4csv & "export_csv.sql", True, False)
au lieu de
Set export_csv_file = fso.CreateTextFile(path4csv & "export_csv.sql", True, True)
Sinon, le fichier était en UNICODE

Merci et bon week-end.

Hors ligne

Pied de page des forums