2011-11-21 38 views
0

我在MySQL中有一个数据库,我想以编程方式在FileMaker Pro中创建所有相同的表和字段。我可以使用JDBC自己做,但我希望已经有一个库可以做到这一点。我试图从Apache中看到DDLUtils,但我无法弄清楚如何构建它(它使用Maven构建系统,当我尝试构建它时发生致命错误)。如何使用JDBC将模式从一个数据库复制到另一个数据库?

回答

0

我自己写了代码,没有变成那么辛苦。这是为了生成模式到MySQL;我还没有测试过FileMaker,但它应该非常相似。

package com.prosc.db; 

import java.sql.DatabaseMetaData; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.HashSet; 
import java.util.Set; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* Created by IntelliJ IDEA. User: jesse Date: 11/21/11 Time: 1:34 PM 
*/ 
public abstract class SchemaGenerator { 
    private static final Logger log = Logger.getLogger(SchemaGenerator.class.getName()); 

    public String createDatabaseSql(String databasename) { 
     return "CREATE DATABASE " + databasename; 
    } 

    /** This should return the String required to create a new table 
    * @param tableName The name of the table in the source database. This is also used as the name of the table to generate. 
    * @param metaData A JDBC metadata object from the source database (where the schema is being created from, not where it's being written to) 
    * */ 
    public String createTableSql(DatabaseMetaData metaData, String tableName) throws SQLException { 
     ResultSet columnsMetadata = metaData.getColumns(null, null, tableName, null); 
     Set<String> pkNames = new HashSet<String>(3); 

     try { 
      ResultSet pkResultSet = metaData.getPrimaryKeys(null, null, tableName); 
      while(pkResultSet.next()) { 
       pkNames.add(pkResultSet.getString(4)); 
      } 
     } catch(Exception e) { 
      log.log(Level.WARNING, "Could not determine primary keys; will need to be manually configured", e); 
     } 

     StringBuffer sql = new StringBuffer(); 
     sql.append("CREATE TABLE " + tableName + " ("); 
     String delim = ""; 
     while(columnsMetadata.next()) { 
      sql.append(delim); 
      delim = ", "; 

      String columnName = columnsMetadata.getString(4); 
      String sqlTypename = columnsMetadata.getString(6); 
      int typeCode = columnsMetadata.getInt(5); 
      String targetTypename = targetTypename(sqlTypename, typeCode); 
      if(targetTypename == null) { 
       log.info("Unknown typename for type code " + typeCode + "; SQL type name is " + sqlTypename); 
       continue; 
      } 
      int columnSize = columnsMetadata.getInt(7); 
      boolean nullsProhibited = "NO".equalsIgnoreCase(columnsMetadata.getString(18)); 
      int precision = columnsMetadata.getInt(9); 
      appendFieldCreationClause(sql, columnName, targetTypename, columnSize, precision, nullsProhibited, pkNames.contains(columnName), metaData.getIdentifierQuoteString(), columnsMetadata); 
     } 
     sql.append(")"); 
     return sql.toString(); 
    } 

    public void appendFieldCreationClause(StringBuffer buffer, String columnName, String targetTypename, int columnSize, int precision, boolean nullsProhibited, boolean isPrimaryKey, String identifierQuoteString, ResultSet columnMetaData) { 
     if(isPrimaryKey) { 
      targetTypename = "INT"; 
      precision = 0; 
     } 
     buffer.append(identifierQuoteString + columnName + identifierQuoteString + " " + targetTypename); 
     if(columnSize > 0) { 
      buffer.append("(" + columnSize); 
      if(precision > 0) { 
       buffer.append("," + precision); 
      } 
      buffer.append(")"); 
     } 
     if("id".equalsIgnoreCase(columnName)) { 
      buffer.append(" UNIQUE"); 
     } 
     if(nullsProhibited) { 
      buffer.append(" NOT NULL"); 
     } 
     if(isPrimaryKey) { 
      buffer.append(" AUTO_INCREMENT"); 
      buffer.append(" PRIMARY KEY"); 
     } 
    } 

    public String targetTypename(String sqlTypename, int typeCode) { 
     return sqlTypename; 
    } 
} 
相关问题