Pyodbc - Read Primary Keys From Ms Access (mdb) Database
When I try to use cursor.primaryKeys('tablename') then exception occurs: Error: ('IM001', '[IM001] [Microsoft][ODBC Driver Manager] Driver does not support this function (0) (SQLPr
Solution 1:
For Access ODBC we can usually get the Primary Key columns via the .statistics() method of the pyodbc cursor
object:
crsr = conn.cursor()
table_name = 'MyTable'# dict comprehension: {ordinal_position: col_name}
pk_cols = {row[7]: row[8] for row in crsr.statistics(table_name) if row[5]=='PrimaryKey'}
print(pk_cols) # e.g., {1: 'InvID', 2: 'LineItem'}
EDIT: This approach assumes that the primary key index for the table is named PrimaryKey
. That is true if the table is created using the MS Access table builder (GUI) but is not true if the table is created using DDL (i.e., CREATE TABLE …
). In those cases the primary key index will have a name like Index_EA5344E1_0942_445C
so the above method won't work, but we can use ACE DAO instead:
import win32com.client # needs `pip install pywin32`defget_access_primary_key_columns(db_path, table_name):
db_engine = win32com.client.Dispatch("DAO.DBEngine.120")
db = db_engine.OpenDatabase(db_path)
tbd = db.TableDefs(table_name)
for idx in tbd.Indexes:
if idx.Primary:
return [fld.Name for fld in idx.Fields]
if __name__ == "__main__":
print(
get_access_primary_key_columns(
r"C:\Users\Public\Database1.accdb", "team"
)
)
# ['city', 'prov']
Solution 2:
Here is solution using pythonnet and Oledb Jet driver. Note that this does not preserve the order of primary keys as columns:
import clr
import System
import System.Data.OleDb
from System.Data.OleDb import OleDbSchemaGuid
defgetKeyNames(tableName, mdbname):
conn = System.Data.OleDb.OleDbConnection()
conn.ConnectionString = ("Provider=Microsoft.Jet.OLEDB.4.0;""Data source={}".format(mdbname))
conn.Open()
returnList=[]
mySchema = (conn).GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys,
[None, None, tableName])
columnOrdinalForName = mySchema.Columns["COLUMN_NAME"].Ordinal
for r in mySchema.Rows:
returnList.append(r.ItemArray[columnOrdinalForName])
conn.Close()
return returnList
getKeyNames(table_name,mdbname)
Post a Comment for "Pyodbc - Read Primary Keys From Ms Access (mdb) Database"