如何将数据库从 Filemaker 迁移到 Mysql?

Posted

技术标签:

【中文标题】如何将数据库从 Filemaker 迁移到 Mysql?【英文标题】:How to migrate the database from Filemaker to Mysql? 【发布时间】:2011-10-26 17:28:40 【问题描述】:

我正在重建一个基于 Symfony1.4 和 mysql 5.1 的 ERP 系统。挑战在于以前的系统是在 Filemaker Pro 上构建的,我必须将所有以前的数据迁移到当前系统。为此,首先我需要将所有数据移动到具有完整架构结构的 MySQL DB 中,然后我可以根据需要通过编写脚本将数据映射到当前系统架构。

我应该如何进行第一步?是否有任何现有的工具或流程可以做到这一点?

任何帮助将不胜感激!提前致谢!

【问题讨论】:

【参考方案1】:

最简单的方法是将数据从 FileMaker 导出为某种通用格式。为此,您需要在 FileMaker 中打开文件,对于每个表格,您需要转到与表格关联的布局并使用菜单显示所有记录并导出。

确保仅导出数据字段(文本、数字、日期、时间和时间戳),因为 FileMaker 通常具有大量计算字段(计算和摘要)。 (要做到这一点,首先进入文件 - 定义数据库,然后进入一些表,按类型对文件进行排序,并记下最后一个数据字段。

这不会导出容器字段,但大多数应用不会存储此类数据。仍然可以导出它们,但需要自定义脚本。

下一个选项是使用 ODBC。它是“下一个”,因为它不太方便而且通常速度较慢。

如果您没有 FileMaker 的副本,您可以从他们的网站下载 30 天试用版;它功能齐全。

【讨论】:

我的第一个想法是 XML,而语法看起来有点复杂。对有助于该过程的应用有什么建议吗?【参考方案2】:

我目前正在使用 JDBC 在 Java 中执行此操作。您需要将 JDBC 驱动程序和 MySQL 导入您的库中。我目前正在我的其他帖子中寻找处理大量数据的最佳实践。

您可能必须自己在 MySQL 中创建表,我可能会推荐它,因为 FMPro 通常有一个奇怪的设置,您可能不想完全复制(我在最近的一篇文章中注意到字段也必须设置为长度,否则事情就会变得混乱......)。一个轻松的下午在 MySQL Developer(或他们现在所说的任何名称)中绘制一些漂亮的图表?

这里有一些秘籍:

public static String dbaseURL = "jdbc:filemaker://machineIP:2399/database";

public static void FMProConnect() 

// Load the JDBC to ODBC driver
try 

    Class.forName("com.filemaker.jdbc.Driver");

 catch(java.lang.ClassNotFoundException e) 
        System.err.print("ClassNotFoundException: ");
        System.err.println(e.getMessage());


public static void copyTable()
FMProConnection.FMProConnect();
Connection dbConnection = null;
Statement query = null;
PreparedStatement stmt = null;
    try 
      // Create a database connection
  dbConnection =
    DriverManager.getConnection(dbaseURL, "fmprouser", "fmpropassword");
  // Create a statement and execute the SQL query
  query = dbConnection.createStatement();

catch (SQLException e) 
  System.out.println("Error connecting to dbase.");
  e.printStackTrace();
  //System.exit(1);


ResultSet results = null;
try 

  results =
    query.executeQuery("SELECT * from table");

  // Iterate through the results and print them to standard output
     Connection con = DriverManager.getConnection("jdbc:mysql://mysqlserver.com/database","username","password");

  while (results.next()) 
    String fname = results.getString("field");
    String lname = results.getString("field1");
 // System.out.println("Found user \"" + fname + " " + lname + "\"");
  stmt = con.prepareStatement("INSERT ignore INTO table (field, field1 values (?, ?)");
  stmt.setString(1, fname);
  stmt.setString(2, lname);
  stmt.executeUpdate();

  
  System.out.println("Completed Customers");

catch (SQLException e) 
  System.out.println("Error retrieving data from database.");
   e.printStackTrace();
  //System.exit(1);




【讨论】:

【参考方案3】:

无软件转换: 这是一篇写得很好的文章的链接,展示了如何完全不使用任何软件从 FileMaker Pro 传输数据。

[http://drilix.com/en/tutorial/sql-migrate-filemaker-mysql-without-any-software][1]

文件访问权限: FileMaker 数据库文件可能没有可见的导出功能。在 FileMaker 中,可以实施自定义菜单来禁用导出功能。要解决此类问题,您需要使用管理员帐户密码登录数据库,并具有 [完全访问] 权限。然后可以选择菜单:Tools->Custom Menus->[FileMaker Standard FileMaker Menus] 选择此菜单后,所有常规菜单都将可用。

FileMaker 二进制文件格式: 重要的是要意识到 FileMaker 数据库使用专有的二进制文件格式来存储其数据。这些文件都不能在任何 Linux 或 UNIX 操作系统上直接读取,因为文件格式尚未公开。我只知道 FileMaker Inc. 之外的一个人成功地对现代版本的文件格式(.fp7、.fmp12 版本)进行了逆向工程。

这意味着要从 FileMaker 数据库中提取数据,您必须始终在 MacOSX 或 Windows 上运行 FileMaker 软件才能提取数据。这与读取 Access .mdb/.accdb 文件完全不同,后者可以使用开源替代方案。

ODBC 与文件导出: 将数据从 FileMaker 导出为任何非本机文件格式存在一些重要限制。可能会丢失 UTF8 格式的数据、截断某些格式的数据以及重复字段数据的问题。这就是为什么我建议通过 ODBC 直接连接到 FileMaker,并将数据直接传输到 MySQL(或您选择的任何其他数据库)。

什么是重复字段? FileMaker 中的重复字段类似于将数据数组存储在单个记录的单个字段中。我通常建议将这些数据分离到相关记录中,由父记录的主键关联。上面链接的 perl 脚本完成了这个任务。但您必须提前在 FileMaker 中准备好数据。由于 FileMaker 不再支持通过其 ODBC 驱动程序重复字段,因此您需要在 FileMaker 中创建一个脚本以将所有重复值移动到第一个重复值中。 因此,如果您有这样的重复值字段:

Field1[1]="abc"
Field1[2]="def"
Field1[3]="ghi"

您将数据移动到:

Field1[1]="abc"<TAB>"def"<TAB>"ghi"

然后您可以遍历 Field1[1] 中的 TAB 分隔值,以将数据写入相关表中。

【讨论】:

以上是关于如何将数据库从 Filemaker 迁移到 Mysql?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 Ms 访问迁移到 Derby 数据库或如何将数据从 My sql 迁移到 Derby 数据库

在Linux中进行MySQL数据迁移

MySQL5.7迁移表空间——普通表

如何将数据从 OpenTSDB 迁移到 TDengine?

如何使用文件将数据从 mysql 迁移到 clickhouse?

如何将数据从 Redshift 迁移到 BigQuery