Code: Alles auswählen
# -*- coding: iso-8859-1-*-
Die Quelltextdatei erstellt habe ich mit MyEclipse, habe dort aber bisher noch nirgends gesehen, dass ich das Coding irgendwo einstellen kann und hab da auch noch nie was daran geändert... :S
Code: Alles auswählen
# -*- coding: iso-8859-1-*-
So macht es UTF-8 nunmal Je nach unicode Zeichen wird es mit bis zu 4 Zeichen gespeichert, siehe: http://de.wikipedia.org/wiki/Utf8meneliel hat geschrieben:2 Zeichen pro Umlaut
In deinem Fall heißt das die csv Daten in unicode wandeln und der Datenbank als UTF-8 übergeben.Der beste Weg, mit Daten umzugehen, ist der folgende:
* möglichst früh die externen Daten in Unicode wandeln
* intern alle Daten in Unicode belassen
* erst bei der Ausgabe von Daten von Unicode in das Ziel-Encoding wandeln
Code: Alles auswählen
# -*- coding: cp1252 -*-
db = DB()
test = u'\xe4'
x = test.encode("cp1252")
insert_string = "INSERT INTO ADRESSEN (PfBezNr) VALUES('%s')" %x
db.selection(insert_string)
# class DB:
'''Klasse die Verbindungsaufbau und Kommunikation mit der Datenbank übernimmt'''
def __init__(self):
my_dsn = cx_Oracle.makedsn("host",1234,"sid")
self.db = cx_Oracle.connect("user","pwd",my_dsn)
print self.db
def __del__(self):
self.db.close()
def selection(self,query):
cursor = self.db.cursor()
cursor.execute(query)
try:
sel = cursor.fetchall()
cursor.close
return sel
except:
cursor.close
self.db.commit()
Code: Alles auswählen
print repr(row)
Code: Alles auswählen
# -*- coding: cp1252 -*-
db = DB()
test = u'\xe4'
x = test.encode("cp1252")
insert_string = "INSERT INTO ADRESSEN (PfBezNr) VALUES('%s')" %x
db.selection(insert_string)
Code: Alles auswählen
class DB:
...
def execute(self, query, data):
cursor = self.db.cursor()
cursor.execute(query, data)
db = DB()
db.execute(
query = "INSERT INTO ADRESSEN (PfBezNr) VALUES('%s')",
data = (u'\xe4',)
)
Code: Alles auswählen
In [29]: select = "INSERT INTO ADRESSEN (PfBezNr) VALUES('%s')"
In [32]: test = 'ö'
In [35]: cursor = db.cursor()
In [36]: cursor.execute(select, test)
---------------------------------------------------------------------------
DatabaseError Traceback (most recent call last)
C:\...\Desktop\<ipython console>
DatabaseError: ORA-01036: illegal variable name/number
In [38]: cursor.execute("INSERT INTO ADRESSEN (PfBezNr) VALUES('%s')",test)
---------------------------------------------------------------------------
DatabaseError Traceback (most recent call last)
C:\...\Desktop\<ipython console>
DatabaseError: ORA-01036: illegal variable name/number
In [37]: cursor.execute(select %test )
# Eintrag aber wieder mit Sonderzeichen in der Datenbank
Code: Alles auswählen
In [18]: select = '''SELECT OBJECTID, Strasse FROM GC_TEST_GK WHERE OBJECTID = 3'''
In [21]: cursor = db.cursor()
In [23]: cursor.execute(select)
Out[23]: [<cx_Oracle.NUMBER with value None>, <cx_Oracle.STRING with value None>]
In [24]: sel = cursor.fetchall()
In [26]: sel
Out[26]: [(3, 'Am Kappele')]
# müsste eigentlich heißten "Am Käppele"
^^ das war mir direkt nach dem Posten hier auch schon aufgefallen und hab es dannb gleich behoben ^^jens hat geschrieben: EDIT: @meneliel: Bei cursor.close fehlen die Klammern Ohne die wird nix gemacht...
Mach mal ein print db.paramstyleparamstyle
String constant stating the type of parameter marker
formatting expected by the interface. Possible values are
[2]:
'qmark' Question mark style,
e.g. '...WHERE name=?'
'numeric' Numeric, positional style,
e.g. '...WHERE name=:1'
'named' Named style,
e.g. '...WHERE name=:name'
'format' ANSI C printf format codes,
e.g. '...WHERE name=%s'
'pyformat' Python extended format codes,
e.g. '...WHERE name=%(name)s'
Code: Alles auswählen
In [41]: print db.paramstyle
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
C:\Dokumente und Einstellungen\mengel\Desktop\<ipython console>
AttributeError: 'cx_Oracle.Connection' object has no attribute 'paramstyle'
Code: Alles auswählen
>>> import cx_Oracle
>>> cx_Oracle.paramstyle
'named'
Code: Alles auswählen
db = DB()
cursor = self.db.cursor()
cursor.execute(
"INSERT INTO ADRESSEN (PfBezNr) VALUES(:data)",
{ "data": u'\xe4' }
)
Code: Alles auswählen
cursor.execute("INSERT INTO ADRESSEN (PfBEZNR) VALUES(:data)", {"data":u'\xe4'.encode("cp1252")})