python
  • sql
  • database
  • ms-access
  • pyodbc
  • 2016-06-08 151 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) 
    
    相关问题