【问题标题】:Import database from File PROGRAMMATICALLY?以编程方式从文件导入数据库?
【发布时间】:2011-03-25 05:55:29
【问题描述】:

有没有办法用 SQL 以编程方式从文件中导入整个数据库? ( .CSV 、 .SQL 和 .DB 文件都可以)

谢谢!!

澄清后编辑:

我对独立于数据库的解决方案感兴趣(必须适用于所有类型的数据库(Mysql、SQL Server、PostGres、Oracle...)

【问题讨论】:

  • @Giorgio,您使用哪个 RDBMS?
  • 问题还不全面。你在说什么数据库? Oracle 支持 SQL loader,SQL Server 也支持类似的工具。
  • 一旦我们知道数据库的风格,这个问题几乎肯定会与现有问题重复。
  • 这才是重点!有没有独立于数据库的解决方案!?无论如何,我使用 Sqlite 作为数据库和 Java 作为编程语言,如果你知道这种组合的解决方案,无论如何告诉我!谢谢!!
  • “是否有独立于数据库的解决方案!?”答案是否定的。

标签: sql database csv import


【解决方案1】:

mysql -u -p

导入 csv 需要一个脚本(使用例如 PHP)将正确的字段放在查询的正确位中。

【讨论】:

  • 这个命令是 PHP 的一部分还是 Mysql 的一部分并且必须插入到命令行 shell 中?
【解决方案2】:

MySQL:LOAD DATA INFILE 用于 csv;对于使用 MySQL 生成的 .sql 文件,请使用 shell。


对于 SQLite:请参阅 this SO question

SQL Server:显然有BULK INSERT 命令。

您不会为 SQL 命令找到与数据库无关的语法,因为没有。

可能有一个围绕数据库的包装库,但我不知道。 (或者您可以尝试使用 ODBC,但这是面向连接的,不允许直接访问文件)

也许有一个与 GUI 相关的交互式软件工具可以做到这一点。

另请注意,将数据直接从数据库服务器上的文件加载到数据库中几乎肯定需要安全权限才能这样做(否则会带来安全风险)。

【讨论】:

  • 嘿!我想在代码中以编程方式做到这一点!我需要编写一个算法,每次导入不同的数据库文件,这样我就不能在 shell 中键入命令
【解决方案3】:

如果您使用的是 SQL Server,请查看SSIS

【讨论】:

    【解决方案4】:

    好的,所以我实际上找到了一个独立于数据库的解决方案,可以很容易地从 .Sql 文件中导入数据库! :)

    因此,无论您拥有哪个数据库(Mysql、Sqlite、...),请执行以下操作:

    1) 将您的数据库导出为 .sql 格式。 (这个 .sql 文件将包含所有 sql 命令,例如 CREATE TABLE... INSERT INTO table...) (您可能需要删除以 CREATE TABLE 开头的行,只保留以 INSERT 开头的行...)

    2) 然后在您使用的语言中编写一些代码来读取 Sql Lite 文件的每一行并将其存储到字符串数组 (String[])

    3) 然后将数组String[]中包含的每个String作为sql命令执行

    我已经用 Java 实现了这个:

    导入 java.io.BufferedReader; 导入 java.io.DataInputStream; 导入 java.io.FileInputStream; 导入 java.io.InputStreamReader; 导入 java.util.LinkedList; 导入 java.util.List;

    导入 android.content.Context; 导入android.database.sqlite.SQLiteDatabase;

    公共类 DatabaseImporter {

    private static DatabaseImporter instance; public static DatabaseImporter getInstance(){ if(DatabaseImporter.instance == null) instance = new DatabaseImporter(); return DatabaseImporter.instance; } private DatabaseImporter (){ } public void importDatabaseFromFile(Context context, String databaseName , String filePath){ SQLiteDatabase database = //CREATE UR DATABASE WITH THE COMMAND FROM THE DATABASE API YOUR USING this.executeSqlCommands( database , this.readSqlCommandsFromFile(filePath) ); } private String[] readSqlCommandsFromFile(String filePath){ String[] sqlCommands = new String[0]; List<String> sqlCommandsList = new LinkedList<String>(); try{ // Open the file that is the first // command line parameter FileInputStream fstream = new FileInputStream(filePath); BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); String strLine; //Read File Line By Line while ((strLine = br.readLine()) != null) { if(!strLine.equals("") && !strLine.equals(" ") && strLine != null) sqlCommandsList.add(strLine); } //Close the input stream in.close(); }catch (Exception e){//Catch exception if any System.err.println("Error: " + e.getMessage()); } sqlCommands = new String[sqlCommandsList.size()]; sqlCommandsList.toArray(sqlCommands); return sqlCommands; } private void executeSqlCommands(SQLiteDatabase database, String[] sqlCommands){ for(int i = 0; i < sqlCommands.length ; i++){ database.execSQL(sqlCommands[i]); } }

    }

    【讨论】:

    • 这不是数据库独立的,那是 SQLite 的。
    • 该方法与数据库无关,只有代码的 sn-p 是特定于数据库的
    猜你喜欢
    • 2018-11-27
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多