使用Python构建MS Access数据库

8
我计划竞标的一个项目的主要目标是使用Python创建Microsoft Access数据库。主要的DB后端将是postgres,但计划导出Access图像。这将是一个Web应用程序,将从用户获取输入并通过黑盒子处理并输出结果作为access db。 Web应用程序将在Linux服务器上构建。
我有几个相关的问题:
  • 是否有可靠的库或模块可以使用?
  • 您在使用Access和Python方面的经验如何?
  • 需要注意哪些技巧、诀窍或必须避免的情况?
谢谢 :)

如果已安装Access,则可以使用Python for Windows扩展从Python自动化它:http://sourceforge.net/projects/pywin32/ - HansUp
@HansUp - 不会安装在Web应用程序上,因为它将在Linux服务器上运行。 - dassouki
将 MS Access 数据库填充在 Linux 中。 - abbot
这是一个非常困难的问题。如果我没记错,甚至 Access 也无法正确地读取或写入访问数据库;-) ……他们关于向后兼容性的历史几乎是一场噩梦。 - 6502
8个回答

5

你能使用sqlite数据库代替吗?

编辑:

如果必须在Linux上,而且必须是MS Access,则我相信这是您唯一的选择,但它要花费1550美元。

你要么得花钱,要么说服客户改变其他两个参数之一。个人而言,我会推荐将数据库文件更改为sqlite。

当然,你也可以编写自己的数据库驱动程序,但可能值得花时间花1550美元。mdbtools已经致力于此多年,该项目几乎被放弃了。

找到了,有点类似

好吧,我无法放手,发现有一个名为Jackcess的Java库,可在任何可以运行jvm的平台上写入MS Access mdb文件。当然,这是Java而不是Python,但也许你可以学习足够的Java来编写一个应用程序,并从Python中执行它?或者完全切换到Java,随你喜欢。


严格来说,该应用程序的输出必须是一个MS Access MDB文件。 - dassouki
我以为你会这么说。 - James
谢谢您的建议。我已经八年没碰Java了,但我相信我能够学习足够的知识以使其成为Python可用的API。 - dassouki
2
好的,你已经有了Jackcess,所以在Linux上支持MS Access文件似乎已经解决了。但是问题仍然存在,它是用Java编写的,但是代码必须使用Python。难道Jython不是一个解决方案吗?如果不是,为什么? - Tadeck
在Python中使用Java:您可以使用Python模块jpype来实例化一个带有jackess jar的JVM,调用MSAccess。 - Martin Thøgersen

2
各种对于重复问题的回答表明,你在Linux服务器上创建MS Access数据库的“主要目标”是不可实现的。
当然,这样的目标本身并没有什么价值。如果你告诉我们Access数据库的用户/消费者预期将使用它做什么,也许我们可以帮助你。可能性:(1)创建一个脚本和一组文件,用户下载并运行以创建Access数据库(2)如果只是为了普通用户的检查/操作,Excel文件可能会做到。

严格来说,该应用程序的输出必须是一个MS Access MDB文件。 - dassouki
通过使用Jython/Jackcess、Python和Java/Jackcess转换器或将Jackcess移植到Python,似乎可以实现这个目标。但毫无疑问,这将是一件痛苦的事情。或者支付1500并使用unixODBC(可能比使用Jackcess内部开发更便宜)。 - extraneon

2
如果你熟悉以下知识:
- Python,它的数据库模块和ODBC配置
那么你应该知道如何做到:
- 打开一个数据库,读取一些数据,将其插入到另一个数据库中
如果是这样,那么你离所需的解决方案非常近了。诀窍在于,你可以将MDB文件作为ODBC数据源打开。现在:我不确定你是否可以在MDB文件中使用ODBC“创建表”,因此让我提出以下建议:
1. 创建一个名为“TARGET.MDB”的MDB文件——带有必要的表格、表单、报告等。(放一些虚拟数据并测试它是否是客户想要的。) 2. 设置一个ODBC数据源到文件“TARGET.MDB”。测试以确保你可以读写。 3. 删除所有虚拟数据——但保留表格定义。将文件重命名为“TEMPLATE.MDB”。 4. 当你需要生成一个新的MDB文件时:用Python复制TEMPLATE.MDB到TARGET.MDB。 5. 打开数据源以写入TARGET.MDB。创建/复制所需的记录。 6. 关闭数据源,将TARGET.MDB重命名为TODAYS_REPORT.MDB...或者对于这个特定的数据导出,任何有意义的名称。
这对你有用吗?
在Windows上完成所有这些工作可能会更容易,因为ODBC的支持将最广泛可用。但是,我认为原则上你可以在Linux上做到这一点,只要你找到正确的ODBC组件以通过ODBC访问MDB。

谁给你一对互相矛盾的要求,即输出必须是Jet/ACE MDB格式,而创建必须在Linux系统上进行?这简直是疯狂的行为。 - David-W-Fenton
@David-W-Fenton:这就是顾客。 :) - extraneon
我会解雇那些不让我按照他们所付费用的工作方式进行工作的客户。 - David-W-Fenton

1
你可以使用微软的 officedata 命名空间将数据导出为 XML。Access 不应该有任何问题消耗它。您可以提供单独的 xsd 模式,或直接在文档树中编码类型和关系。这里是一个简单的例子:
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns="urn:schemas-microsoft-com:officedata">

<Table1><Foo>0.00</Foo><Bar>2011-05-11T00:00:00.000</Bar></Table1>
<Table1><Foo>3.00</Foo><Bar>2011-05-07T00:00:00.000</Bar></Table1>

<Table2><Baz>Hello</Baz><Quux>Kitty</Quux></Table2>
</dataroot>

在谷歌上搜索 "urn:schemas-microsoft-com:officedata" 应该会有一些有用的结果。


0

我建议将数据移动到Microsoft SQL数据库中,然后将数据链接或导入到Access中。


该项目的核心要求是输出一个msaccess数据库。他们用于托管的服务器是Linux。 - dassouki
而且后端可以是我想要的任何东西,输出必须存储在Access MDB中。 - dassouki

0

你能创建一个自解压文件,发送给已安装Microsoft Access的Windows用户吗?

  1. 包含一个空白的.mdb文件。
  2. 动态构建包含表格、模式和数据的xml文档。
  3. 包含一个导入可执行文件,将所有的xml文档导入到Access的.mdb文件中。

这对用户来说是额外的步骤,但你可以依赖他们现有的驱动程序、软件和桌面环境。


我希望,正如我之前所说的那样,输出必须是一个mdb应用程序。 - dassouki

0

嗯,看起来你需要在运行Windows的Linux框上安装vmware服务器的副本,在虚拟机中编写访问的Web服务,并与主Linux框进行通信。你不会在Linux上找到创建Access数据库的方法。把它称为要求并不能使其在技术上成为可能。


在Linux上,一切皆有可能 ;) - James

0

http://adodb.sourceforge.net/ - 可在Linux上安装,用PHP或Python编写,连接Access和PostgreSQL。

我们已经使用它多年了,它运行得非常好。


那么,如果我有一个“模板”MS Access数据库,只需进行少量编辑/更改,它就应该完美地工作了吗? - dassouki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接