有没有办法用SQL以编程方式从文件导入整个数据库? (.CSV,.SQL和.DB文件都可以)
谢谢!
在澄清之后被编辑:
我感兴趣的是一个独立于数据库的解决方案(必须适用于所有类型的数据库(Mysql,SQL Server,PostGres,Oracle ......)
答案 0 :(得分:3)
MySQL:LOAD DATA INFILE
用于csv的;对于使用MySQL生成的.sql文件,请使用shell。
对于SQLite:请参阅this SO question。
SQL Server:显然有BULK INSERT
命令。
您不会为SQL命令找到与数据库无关的语法,因为没有SQL语句。
数据库周围可能有一个包装器库,但我不知道它。 (或者您可以尝试使用ODBC,但这是面向连接的,不允许直接访问文件)
也许有一个与GUI相关的交互式软件工具可以做到这一点。
另请注意,将数据直接从数据库服务器上的文件加载到数据库中几乎肯定需要安全权限(否则会带来安全风险)。
答案 1 :(得分:2)
好的,所以我实际上找到了一个数据库独立的解决方案,很容易从.Sql文件导入数据库! :)
无论您使用哪个数据库(Mysql,Sqlite,...),都要执行以下操作:
1)将数据库导出为.sql格式。 (此.sql文件将包含所有sql命令,如CREATE TABLE ... INSERT INTO表...) (您可能需要删除以CREATE TABLE开头的行,只留下以INSERT开头的行...)
2)然后在您正在使用的语言中编写一些代码,这些代码读取Sql Lite文件的每一行并将其存储到String of String(String [])
3)然后执行数组String []中包含的每个String作为sql命令
我在Java中实现了这个:
import java.io.BufferedReader; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.List;import android.content.Context; import android.database.sqlite.SQLiteDatabase;
public class 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]); } }
}
答案 2 :(得分:1)
mysql -u -p&lt; dumpfile.sql
导入csv需要一个脚本(使用例如PHP)将正确的字段放在查询的正确位置。
答案 3 :(得分:0)
如果您使用的是SQL Server,请查看SSIS