python
  • sql
  • database
  • ms-access
  • pyodbc
  • 2016-06-08 160 views 2 likes 
    2

    讀取主鍵時,我嘗試使用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'))沒有任何顯示主鍵。

    +0

    這裏是解決方案在.NET中:http://stackoverflow.com/questions/862749/how-to-get-the-primary-key-of-an-ms-access-table-in-c-sharp – denfromufa

    回答

    3

    對於訪問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'} 
    
    +0

    什麼是相當於' OleDbSchemaGuid.Primary_Keys'和'Columns [「COLUMN_NAME」]。Ordinal'?現在你已經從統計數據中得到硬編碼的索引5,7和8。 – denfromufa

    +2

    @denfromufa - 這些是[cursor object](https://github.com/mkleehammer/pyodbc/wiki/Cursor)的'.statistics'方法文檔中定義的列索引。你可以創建你自己的變量,例如'ordinal_position_col = 7',但是除了使代碼更加自我記錄外,它也可以是相同的。 –

    +2

    實際上它是由Microsoft的ODBC驅動程序定義的:https://msdn.microsoft.com/en-us/library/ms711022(VS.85).aspx – denfromufa

    1

    這裏是使用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) 
    
    相關問題