Search code examples
pythonsqlms-accesspyodbc

How to get datatypes of specific fields of an Access database using pyodbc?


I'm using pyodbc to data-mine a big database in a .mbd (access) file.

I want to create a new table taking relevant information from several existing tables (to then feed it to a tool).

I think I know all I need to transfer the data, and I know how to create a table given column names and datatypes, but I'm having trouble getting the datatypes (INTEGER, VARCHAR, etc.) of the respective columns in the existing tables. I need these types to create the new columns compatibly.

What I found on the internet (like this and this) is getting me into invalid-command trouble, so I think this is a platform-specific issue. Then again, I'm fairly green on databases.

Does anybody know how to get the types of these fields?


Solution

  • The reason why those articles aren't helping you is because they are for SQL Server. SQL Server has system tables that you can query to get the column data, MS Access doesn't. MS Access only lets you query the object names.

    However ODBC does support getting the schema through its connection via the ODBC.SQLColumns functions.

    According to this answer PyODBC exposes this via a cursor method

    # columns in table x
    for row in cursor.columns(table='x'):
        print row.column_name 
    

    As Mark noted in the comments you probably also want the row.data_type. The link he provided includes all the columns it provides

    1. table_cat
    2. table_schem
    3. table_name
    4. column_name
    5. data_type
    6. type_name
    7. column_size
    8. buffer_length
    9. decimal_digits
    10. num_prec_radix
    11. nullable
    12. remarks
    13. column_def
    14. sql_data_type
    15. sql_datetime_sub
    16. char_octet_length
    17. ordinal_position
    18. is_nullable: One of SQL_NULLABLE, SQL_NO_NULLS, SQL_NULLS_UNKNOWN.