使用Access ODBC使用DECIMAL列创建表

时间:2016-06-21 11:30:25

标签: python sql ms-access decimal pypyodbc

我正在使用pypyodbc模块创建数据库并在其中添加一个表。

我使用的代码如下:

import pypyodbc
pypyodbc.win_create_mdb('D:\\test.mdb')
connection_string = 'Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\test.mdb'
connection = pypyodbc.connect(connection_string)
SQL = "CREATE TABLE [test] ([FID] INT,[AREA] FLOAT,[CODE] VARCHAR(10),[X_CO] DECIMAL(10,3));"
connection.cursor().execute(SQL)
connection.commit()
connection.close()

上面的代码创建了数据库,但在创建表时会产生错误。错误如下:

  

ProgrammingError:(u'42000',u'[42000] [Microsoft] [ODBC Microsoft Access Driver]定义字段中的语法错误。

从网上搜索我发现问题出在最后一个字段的DECIMAL类型上,当我从查询中删除它时,它会创建表格。

我还尝试更改Access中的选项以使数据库与ANSI 92兼容,当我这样做时,可以从Access内部创建表。

因为这个过程必须完成数百个数据库,所以我想在python循环中执行此操作,但为了实现这一点,必须从上面的代码中创建数据库和表。

我在语法中遗漏了什么? 有谁知道这是否是模块的问题?

1 个答案:

答案 0 :(得分:2)

Access ODBC驱动程序中的DDL处理存在许多缺陷,遗憾的是您遇到过其中一个。如果要创建包含DECIMAL列的表,则需要使用pywin32(版本211或更高版本)中的adodbapi和Access OLEDB提供程序来执行CREATE TABLE语句:

# -*- coding: utf-8 -*-
import adodbapi  # (from pywin32)
conn_str = (
    r"Provider=Microsoft.Jet.OLEDB.4.0;"
    r"Data Source=C:\Users\Public\2003test.mdb;"
    )
conn = adodbapi.connect(conn_str)
crsr = conn.cursor()
sql = """\
CREATE TABLE [test] (
    [FID] INT,
    [AREA] FLOAT,
    [CODE] VARCHAR(10),
    [X_CO] DECIMAL(10,3))
"""
crsr.execute(sql)
conn.commit()
crsr.close()
conn.close()