Es tauchen immer wieder Fragen auf, die ich mit diesem Beispiel beantworten möchte:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import pyodbc
DBENCODING = "cp1252"
DSN = (
"DRIVER={Microsoft Access Driver (*.mdb)};"
"DBQ=J:\\DOKUMENTE UND EINSTELLUNGEN\\GEROLD\\DESKTOP\\test.mdb"
)
def create_table(conn):
cur = conn.cursor()
sql = """
CREATE TABLE addresses (
id AUTOINCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
)
"""
cur.execute(sql)
conn.commit()
def insert_address(conn, first_name, last_name):
# Von Unicode nach DBENCODING umwandeln
if isinstance(first_name, unicode):
first_name = first_name.encode(DBENCODING)
if isinstance(last_name, unicode):
last_name = last_name.encode(DBENCODING)
cur = conn.cursor()
sql = """
INSERT INTO addresses (
first_name, last_name
) VALUES (
?, ?
)
"""
cur.execute(sql, (first_name, last_name))
conn.commit()
def get_all_addresses(conn):
cur = conn.cursor()
sql = """
SELECT
first_name, last_name
FROM
addresses
ORDER BY
first_name, last_name
"""
cur.execute(sql)
#Jede Zeile durchlaufen und die Textfelder nach Unicode umwandeln
for row in cur:
row[0] = row[0].decode(DBENCODING)
row[1] = row[1].decode(DBENCODING)
yield row
def main():
conn = pyodbc.connect(DSN)
create_table(conn)
insert_address(conn, u"Gerold", u"Penz")
insert_address(conn, u"Über", u"den Wolken")
for row in get_all_addresses(conn):
print repr(row)
first_name = row[0]
last_name = row[1]
print repr(first_name), repr(last_name)
conn.close()
if __name__ == "__main__":
main()
EDIT: ACHTUNG! Das Verhalten von pyODBC bei Umlauten hat sich anscheinend geändert. Siehe Beitrag http://www.python-forum.de/post-124912.html#124912
lg
Gerold