讀取主鍵時,我嘗試使用cursor.primaryKeys("tablename")
然後發生異常:pyodbc - 從MS Access(MDB)數據庫
Error: ('IM001', '[IM001] [Microsoft][ODBC Driver Manager] Driver does not support this function (0) (SQLPrimaryKeys)')
list(cursor.columns(table='tablename'))
沒有任何顯示主鍵。
讀取主鍵時,我嘗試使用cursor.primaryKeys("tablename")
然後發生異常:pyodbc - 從MS Access(MDB)數據庫
Error: ('IM001', '[IM001] [Microsoft][ODBC Driver Manager] Driver does not support this function (0) (SQLPrimaryKeys)')
list(cursor.columns(table='tablename'))
沒有任何顯示主鍵。
對於訪問ODBC,我們可以通過.statistics
方法pyodbc cursor
對象獲得主鍵列:
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'}
什麼是相當於' OleDbSchemaGuid.Primary_Keys'和'Columns [「COLUMN_NAME」]。Ordinal'?現在你已經從統計數據中得到硬編碼的索引5,7和8。 – denfromufa
@denfromufa - 這些是[cursor object](https://github.com/mkleehammer/pyodbc/wiki/Cursor)的'.statistics'方法文檔中定義的列索引。你可以創建你自己的變量,例如'ordinal_position_col = 7',但是除了使代碼更加自我記錄外,它也可以是相同的。 –
實際上它是由Microsoft的ODBC驅動程序定義的:https://msdn.microsoft.com/en-us/library/ms711022(VS.85).aspx – denfromufa
這裏是使用pythonnet和Oledb Jet驅動程序的解決方案。請注意,這不保留主鍵的列順序:
import clr
import System
import System.Data.OleDb
from System.Data.OleDb import OleDbSchemaGuid
def getKeyNames(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)
這裏是解決方案在.NET中:http://stackoverflow.com/questions/862749/how-to-get-the-primary-key-of-an-ms-access-table-in-c-sharp – denfromufa