pyodbc - 使用默认值将列添加到 MS Access

Posted

技术标签:

【中文标题】pyodbc - 使用默认值将列添加到 MS Access【英文标题】:pyodbc - add column to MS Access with default value 【发布时间】:2018-07-31 19:27:22 【问题描述】:

我正在尝试使用 pyodbc 和 Python 3.5 向 MS Access 数据库表中添加一列。

使用表达式

self.cursor.execute("ALTER TABLE data ADD COLUMN testColumn TEXT(10)")

工作正常,但是当我尝试添加默认值(默认“否”)时,它会引发语法错误。我尝试了多种组合,但没有运气。

非常感谢任何帮助!

干杯

【问题讨论】:

【参考方案1】:

遗憾的是,Access ODBC 驱动程序根本不支持CREATE/ALTER TABLE 语句中的列的DEFAULT 子句。 Access 的 ODBC 驱动程序和 OLEDB 提供程序在 DDL 支持方面有所不同,因此不幸的是,对于相同的 DDL 语句,我们可能会得到不一致的结果,如下面使用 ADO 的 VBScript 代码所示:

OLEDB 工作正常...

Option Explicit
Dim conn
Set conn = CreateObject("ADODB.Connection")
Dim connStr
connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\mdbTest.mdb"
conn.Open connStr

On Error Resume Next
conn.Execute "DROP TABLE Cheeses"
On Error GoTo 0
conn.Execute "CREATE TABLE Cheeses (Id LONG PRIMARY KEY, CheeseName TEXT(50) DEFAULT 'Cheddar')"

conn.Execute "INSERT INTO Cheeses (Id) VALUES (1)"

Dim rst
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT CheeseName FROM Cheeses WHERE Id = 1", conn
If rst("CheeseName").Value = "Cheddar" Then
    WScript.Echo "Success"
End If

conn.Close

...但是如果我们将连接字符串更改为使用 ODBC ...

connStr = "Driver=Microsoft Access Driver (*.mdb, *.accdb);Dbq=C:\Users\Public\mdbTest.mdb"

...然后我们尝试执行CREATE TABLE 语句失败

用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序:[Microsoft][ODBC Microsoft Access Driver] CREATE TABLE 语句中的语法错误。

TL;DR - 您不能在 pyodbc 下的 CREATE/ALTER TABLE 语句中使用 DEFAULT 子句。

【讨论】:

感谢您的回复和解释 Gord。我最终创建了(空)列,然后通过运行更新查询用默认值填充它。不漂亮或效率不高,但对于我现在的目的来说已经足够了。 很好的答案。缺少官方文档(或永久消失/过时!),但docs.microsoft.com/en-us/previous-versions/office/developer/… 有以下我认为相关的行:The DEFAULT statement can be executed only through the Jet OLE DB provider and ADO. It will return an error message if used through the Access SQL View user interface. 我自己在 C# 和 .NET 中的实验表明 ODBC 驱动程序与@987654330 有相同的问题@,但 OleDB 可以工作。

以上是关于pyodbc - 使用默认值将列添加到 MS Access的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pyodbc 将表从 MS Access 迁移到 Postgres?

如何使用 python pyodbc 检查表中是不是存在列?

使用 pyodbc 将带日期的数据上传到 MS Access 数据库

Pyodbc 错误 - Python 到 MS Access

Python:根据特定值将列拆分为串联的行

是否需要根据表中的唯一值将列分解为多个列?