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

8
我正在基于Symfony1.4和MySQL 5.1重建ERP系统。挑战在于之前的系统是基于Filemaker Pro构建的,我必须将所有先前的数据迁移到当前系统中。为此,首先需要将所有数据移动到一个MySQL数据库中,并保持先前的架构结构不变,然后可以根据需要编写脚本将数据映射到当前系统架构中。
如何进行第一步?是否有任何现有的工具或过程可以实现这一点?
非常感谢您提供的任何帮助!
3个回答

8
最简单的方法是将数据从FileMaker导出到一些常见格式。要做到这一点,您需要在FileMaker中打开文件,对于每个表,您需要转到与该表相关联的布局并使用菜单显示所有记录并进行导出。
请确保仅导出数据字段(文本、数字、日期、时间和时间戳),因为FileMaker通常具有大量计算字段(计算和汇总)。 (要做到这一点,请首先转到文件 - 定义数据库,然后转到某个表,按类型排序文件,并注意最后一个数据字段。
这不会导出容器字段,但大多数应用程序不存储此类数据。也仍然可以导出它们,但需要自定义脚本。
下一个选项是使用ODBC。它是“下一个”选项,因为它不太方便,通常更慢。
如果您没有FileMaker的副本,可以从其网站下载30天试用版;它是完全功能的。

我的第一个想法是使用XML和语法,但它们看起来有点复杂。你有什么关于帮助处理过程的应用程序建议吗? - Jesse Ivy

3
我目前正在使用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);
}


}

1

无需软件转换: 这是一篇写得很好的文章,展示了如何在不使用任何软件的情况下从FileMaker Pro传输数据。

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

文件访问权限: FileMaker数据库文件可以没有可见的导出功能。在FileMaker中,可以实现自定义菜单来禁用导出功能。要解决这种问题,您需要使用管理员帐户密码登录数据库,并拥有[完全访问]权限。然后,您可以选择菜单:工具->自定义菜单->[FileMaker标准FileMaker菜单] 选择此菜单后,所有常规菜单都将可用。
FileMaker二进制文件格式: 重要的是要意识到,FileMaker数据库使用专有的二进制文件格式存储其数据。由于文件格式未公开,因此无法直接在任何Linux或UNIX操作系统上读取这些文件。我只知道FileMaker Inc.之外的一个人成功地反向工程了现代版本的文件格式(.fp7,.fmp12版本)。
这意味着要从FileMaker数据库中提取数据,您必须始终在MacOSX或Windows上运行FileMaker软件以提取数据。这与读取Access .mdb / .accdb文件完全不同,因为可以使用开源替代方案。

ODBC vs 文件导出: 从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分隔值,将数据写入相关表格。

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