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 nunmalmeneliel 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 KlammernOhne 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")})