Skip to content

Access

Connect to Access DB

# connect to db
try:
    drv = '{Microsoft Access Driver (*.mdb)}'
    con = pyodbc.connect(f'DRIVER={drv};DBQ=' + dbpath)
except pyodbc.InterfaceError:
    drv = '{Microsoft Access Driver (*.mdb, *.accdb)}'
    con = pyodbc.connect('DRIVER={drv};DBQ=' + dbpath)
cursor = con.cursor()

# query
cursor.execute("Select * from tbl")
rows = cursor.fetchall()

# close connection
cursor.close()
con.close()

pyodbc LIKE wildcard

LIKE wildcard characters between queries run in Access and from an external applications are different: Access uses the asterisk as the wildcard character, "2019-09-03*"; External application (like Python) uses the percent sign as the wildcard character, "2019-09-03%".

DAO field type

http://allenbrowne.com/ser-49.html

DAO connect timestamp

df.timestamp should be changed to str

is_timestamp = pd.core.dtypes.common.is_datetime_or_timedelta_dtype(series)
if is_timestamp:
    changes datetime column to str

DAO connect query

import os
import csv
import win32com.client

def open_db(eng, dbpath, lock=False):
    if not os.path.isfile(dbpath):
        log(f'File does not exist.\n    File: {dbpath}', stop=True)
    #create DAO connection to the access database
    eng = win32com.client.Dispatch("DAO.DBEngine.120")
    mdb = eng.OpenDatabase(dbpath, lock) #True = Lock the database.  Prevent getting to multi-user mode
    return mdb

def get_db_fields(table, csvheader):
    fields = []
    for field in csvheader:
        try:
            fields.append(table.Fields.Item(field))
        except:
            log(f'ERROR: Field "{field}" in csv could not be found in table "{table.Name}"', stop=True)
    return fields

def qry_to_list(mdb, qry, header):
    csv = []
    rs = mdb.OpenRecordset(qry)
    fields = get_db_fields(rs, header)
    while not rs.EOF:
        csv.append([field.Value for field in fields])
        rs.MoveNext()
    rs.Close()
    return csv

def list_to_csv(csvheader, csvdata, csvpath):
    with open(csvpath, 'w', newline='') as f:
        w = csv.writer(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        w.writerow(csvheader)
        for row in csvdata:
            w.writerow(row)