读取主键时,我尝试使用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