2017-03-11 3 views
0

현재 독일어 문자 - 움라우트를 무시하는 내 postgresql 데이터베이스에서 쿼리를 실행 중입니다. 그러나 나는 이러한 문자들을 풀고 싶지 않고, 쿼리 결과에 독일어 문자 또는 그와 동등한 문자 (예 : ä = ae)를 사용하려고합니다.ascii 문자로 유니 코드 데이터베이스를 쿼리하는 방법

psycopg2.ProgrammingError: syntax error at or near "?" 
LINE 1: ?SELECT 

코드 조각 :

# -*- coding: utf-8 -*- 

    connection_str = r'postgresql://' + user + ':' + password + '@' + host + '/' + database 

    def query_db(conn, sql): 
     with conn.cursor() as curs: 
      curs.execute(sql) 
      rows = curs.fetchall() 

     print("fetched %s rows from db" % len(rows)) 

     return rows 

    with psycopg2.connect(connection_str) as conn: 
     for filename in files: 
      # Read SQL 
      sql = u"" 

      f = codecs.open(os.path.join(SQL_LOC, filename), "r", "utf-8") 

      for line in f: 
       sql += line.encode('ascii', 'replace').replace('\r\n', ' ') 

      rows = query_db(conn, f) 

어떻게이 같은 쿼리를 전달할 수 있습니다 내가 replace 또는 xmlcharrefreplace 나는 다음과 같은 오류로 인 코드 개체를 변경하면 파이썬 2.7.12

실행 독일어 문자가있는 유니 코드 객체입니까? 나는 또한 시도 는 utf-8으로 쿼리를 디코딩하지만 나는 다음과 같은 오류가 발생합니다 :

여기
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128) 
+0

저는이 용어로 약간 혼란 스럽습니다. 용어 문제로 생각됩니다. "ASCII 문자"라고 할 때 실제로 "ASCII 문자가 맞지 않는 문자"를 의미합니까? [ASCII] (https://en.wikipedia.org/wiki/ASCII)는 영어 (악센트 또는 움라우트 없음)가 사용하는 로마자 알파벳 부분만을 다루는 7 비트 인코딩입니다. 네가 거꾸로 원하는 것에 대해 말하는 것처럼 들린다. – Blckknght

답변

0

가 인코딩 된 동등한를 얻을 수있는 솔루션입니다. 당신은 다시 인코딩을 할 그것을 나중에 할 수 있으며 쿼리에 오류가 생성되지 않습니다

SELECT convert_from(BYTEA 'foo ᚠ bar'::bytea, 'latin-1'); 
+----------------+ 
| convert_from | 
|----------------| 
| foo á<U+009A>  bar    | 
+----------------+ 
SELECT 1 
Time: 0.011s 
0

당신은 단지 conn.set_client_encoding("utf-8") 필요를 다음 방금 유니 코드 문자열을 실행할 수 있습니다 - SQL 및 결과는 인코딩과에 디코딩됩니다 비행 : 우리는 우리가 유니 코드 개체로 반환 값을 원하는 운전자에게 필요로하는이 프로그램의

$ cat psycopg2-unicode.py 
import sys 
import os 
import psycopg2 
import csv 

with psycopg2.connect("") as conn: 
    conn.set_client_encoding("utf-8") 
    for filename in sys.argv[1:]: 
     file = open(filename, "r", encoding="utf-8") 
     sql = file.read() 
     with conn.cursor() as cursor: 
      cursor.execute(sql) 
      try: 
       rows = cursor.fetchall() 
      except psycopg2.ProgrammingError as err: 
       # No results 
       continue 
      with open(filename+".out", "w", encoding="utf-8", newline="") as outfile: 
       csv.writer(outfile, dialect="excel-tab").writerows(rows) 

$ cat sql0.sql 
create temporary table t(v) as 
    select 'The quick brown fox jumps over the lazy dog.' 
    union all 
    select 'Zwölf große Boxkämpfer jagen Viktor quer über den Sylter Deich.' 
    union all 
    select 'Любя, съешь щипцы, — вздохнёт мэр, — кайф жгуч.' 
    union all 
    select 'Mężny bądź, chroń pułk twój i sześć flag.' 
; 

$ cat sql1.sql 
select * from t; 

$ python3 psycopg2-unicode.py sql0.sql sql1.sql 

$ cat sql1.sql.out 
The quick brown fox jumps over the lazy dog. 
Zwölf große Boxkämpfer jagen Viktor quer über den Sylter Deich. 
Любя, съешь щипцы, — вздохнёт мэр, — кайф жгуч. 
Mężny bądź, chroń pułk twój i sześć flag. 

Python2 버전은 조금 더 복잡하다. 또한 출력용으로 사용한 CSV 모듈은 유니 코드를 지원하지 않으므로 해결 방법이 필요합니다. 여기에 있습니다 :

$ cat psycopg2-unicode2.py 
from __future__ import print_function 

import sys 
import os 
import csv 
import codecs 

import psycopg2 
import psycopg2.extensions 
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) 
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY) 

with psycopg2.connect("") as conn: 
    conn.set_client_encoding("utf-8") 
    for filename in sys.argv[1:]: 
     file = codecs.open(filename, "r", encoding="utf-8") 
     sql = file.read() 
     with conn.cursor() as cursor: 
      cursor.execute(sql) 
      try: 
       rows = cursor.fetchall() 
      except psycopg2.ProgrammingError as err: 
       # No results from SQL 
       continue 
      with open(filename+".out", "wb") as outfile: 
       for row in rows: 
        row_utf8 = [v.encode('utf-8') for v in row] 
        csv.writer(outfile, dialect="excel-tab").writerow(row_utf8) 
+0

이 솔루션은 독일어 문자 인 움라우트를 모두 무시합니다. 따라서 'Zwölf'라는 단어는 'Zwlf'가됩니다. 이 해결책은 파이썬 3을 위해 만들어졌고, 아직도 파이썬 2.7.12를 실행 중입니다. – OAK

+0

인쇄 기능을 사용하면서 Python3으로 가정했습니다. 이 예제를 Python2로 포팅했습니다. 그러나 Unicode와 관련이있는 프로그램의 경우 Python3으로 이동하는 것이 좋습니다. 이는 훨씬 더 건전한 것입니다. – Tometzky

+0

나를위한 해결책은'f = codecs.open (os.path.join (SQL_LOC, filename), "r", "utf-8-sig")'및'f.read()'입니다. 요점은 SQL 파일을 utf-8-sig로 인코딩하는 것이 었습니다. – OAK

관련 문제