使用Python创建新的Access数据库和表

问题描述 投票:4回答:4

我正在尝试用Python创建一个Access数据库并为其添加两个新表。我正在使用win32com并设法创建数据库,但无法创建表。我得到的只是无用的Windows错误。谁能帮我?

以下代码工作正常:

dbname = r'C:/Users/Guest/Desktop/NewDB.mdb'
db = Dispatch("Access.Application")
dbEngine = db.DBEngine
workspace = dbEngine.Workspaces(0)

dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0'
newdb = workspace.CreateDatabase(dbname, dbLangGeneral, 64)

如何向此数据库添加新表?

python-3.x ms-access win32com
4个回答
5
投票

由于MS Access既是GUI .exe应用程序又是后端数据库,因此创建数据库与创建数据库对象(如表,视图(即存储的查询),甚至是过程)不同。

作为比较,另一个文件级RDMS,SQLite,必须将其.exe shell打开到CREATE DATABASE。并且服务器级RDMS(SQL Server,MySQL,Postgres)必须登录到服务器实例才能运行该命令。 MS Access没有shell或实例工具,只有应用程序对象。

因此,在使用CreateDatabase方法创建数据库之后,请考虑对CREATE TABLE运行DDL SQL语句,您可以使用Execute()方法。

Python COM接口

from win32com.client import Dispatch

try:
    dbname = r'C:/Users/Guest/Desktop/NewDB.mdb'
    accApp = Dispatch("Access.Application")
    dbEngine = accApp.DBEngine
    workspace = dbEngine.Workspaces(0)

    dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0'
    newdb = workspace.CreateDatabase(dbname, dbLangGeneral, 64)

    newdb.Execute("""CREATE TABLE Table1 (
                      ID autoincrement,
                      Col1 varchar(50),
                      Col2 double,
                      Col3 datetime);""")

except Exception as e:
    print(e)

finally:
    accApp.DoCmd.CloseDatabase
    accApp.Quit
    newdb = None
    workspace = None
    dbEngine = None
    accApp = None

Python的DB API

虽然qacxswpoi在MS Access SQL中不可用,但只有在创建数据库文件后,才能使用任何带有CREATE DATABASE命令的Python ODBC API运行上述Execute

CREATE TABLE

1
投票
import pypyodbc

dbname = r'C:/Users/Guest/Desktop/NewDB.mdb'     
constr = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={0};".format(dbname)

dbconn = pypyodbc.connect(constr)

cur = dbconn.cursor()
cur.execute("""CREATE TABLE Table1 (
                 ID autoincrement,
                 Col1 varchar(50),
                 Col2 double,
                 Col3 datetime);""")
dbconn.commit()

已经创建了一个名为newdb = workspace.CreateDatabase(dbname, dbLangGeneral, 64) 的DAO.Database对象,所以你应该能够简单地继续使用它的newdb方法来运行像这样的DDL语句

Execute

1
投票

看起来你会在newdb.Execute("CREATE TABLE [Table1] ([ID] COUNTER PRIMARY KEY, [TextField] TEXT(50))") 对象上执行一个SQL语句CREATE Table,即在Database上,通过它的newdb方法。

但我不建议在MS Access Application对象上使用COM。对于MS Access数据库,推荐的与DB交互的方法是通过ODBC API直接打开DB,而不是通过Execute()实例。如果你需要应用程序的功能,如报告,打印等,你应该只使用后者。为了通过ODBC与MS Access DB文件交互,我对pyodbc和pypyodbc有很好的经验,不需要COM。通过win32com(但不是Access.Application)通过DAO API进行较低级别访问似乎也很好,但我还没试过。查看Access.Application,了解有关各种连接API和一些代码示例的详细讨论。

其他有用的资源:


0
投票

为了未来读者的利益,问题中的示例代码使用ADO-based tasks来创建新的Access数据库文件。一个更简单的替代方案是使用我的(免费)win32com Python模块,例如,

msaccessdb
© www.soinside.com 2019 - 2024. All rights reserved.