【问题标题】:Can I access sqlite3 using octave?我可以使用八度访问 sqlite3 吗?
【发布时间】:2013-02-02 01:12:36
【问题描述】:

有没有办法从八度读取和写入 sqlite3?

我正在考虑类似于 R 中的 RODBC 或 python 中的 sqlite3 包,但对于 octave。

我看了八度锻造http://octave.sourceforge.net/packages.php

但只能找到'database'包,它只支持postgresql。

详情:

  • 操作系统:Ubuntu 12.04
  • 八度:3.6.2
  • sqlite:3.7.9

【问题讨论】:

    标签: database sqlite odbc octave


    【解决方案1】:

    我意识到这是一个老问题,但这里的大多数答案似乎都没有抓住重点,关注是否存在提供正式接口的定制 octave 包,而不是是否可以从 octave 中执行 sqlite3 查询首先。

    因此,我想我会为任何试图通过八度音程访问 sqlite3 的人提供一个实用的答案;这样做其实很简单,我自己也这样做过很多次了。

    只需对sqlite3 命令进行适当的系统调用(显然这意味着您的系统上安装了 sqlite3 客户端)。我发现这样做最方便的方法是使用

    sqlite3 database.sqlite OutputToFile

    调用 sqlite3 的语法。

    任何修改输出的 sqlite3 命令都可以与查询一起传递,以获得所需格式的输出。

    例如这是一个从表格中绘制频率图表的玩具示例,该图表以 csv 格式返回适当的分数和计数(从输出中删除标题和运行时统计信息)。

      pkg load io   % required for csv2cell (used to collect results)
    
    % Define database and Query
      Database = '/absolute/path/to/database.sqlite';
    
      Query = strcat(
      % Options to sqlite3 modifying output format:
        ".timer off            \n",   % Prevents runtime stats printed at end of query
        ".headers off          \n",   % If you just want the output without headers
        ".mode csv             \n",   % Export as csv; use csv2cell to collect results
      % actual query
        "SELECT Scores, Counts \n",
        "FROM Data;            \n"    % (Don't forget the semicolon!)
      );   
    
    % Create temporary files to hold query and results
      QueryFile   = tempname()  ;   QueryFId = fopen( QueryFile, 'w' );
      fprintf( QueryFId, Query );   fclose(  QueryFId);
      ResultsFile = tempname();
    
    % Run query
      Cmd = sprintf( 'sqlite3 "%s" < "%s" > "%s"',  Database, QueryFile, ResultsFile );
      [Status, Output] = system( Cmd );
    
    % Confirm query succeeded and if so collect Results
    % in a cell array and clean up temp files.
      if Status != 0,     delete( QueryFile, ResultsFile ); error("Query Failed");
      else,   Results = csv2cell( ResultsFile ); delete( QueryFile, ResultsFile );
      end
    
    % Process Results
      Results  = cell2mat( Results );
      Scores   = Results(:, 1);   Counts  = Results(:, 2);
      BarChart = bar( Scores, Counts, 0.7 ); % ... etc
    

    等等,瞧

    【讨论】:

      【解决方案2】:

      根据Octave-Forge,答案是否定的。

      与 SQL 数据库的接口,目前只有使用 libpq 的 postgresql。

      但您可以使用 Octave C++ API 和 SQLite C API 编写自己的数据库包

      【讨论】:

        【解决方案3】:

        正如你已经发现的,新版本的数据库包(2.0.0)只支持postgreSQL。但是,该软件包的旧版本也支持 MySQL 和 SQLite(它们的最后一个版本是 version 1.0.4)。

        它的问题是旧的数据库包不适用于新的 Octave 和 SWIG 版本(我认为数据库包工作的 Octave 的最后一个版本是 3.2.4)。除了缺乏维护者(软件包被放弃了近 4 年),它对 SWIG 的使用正成为一个问题,因为它使其他开发人员更难介入。不过,一些用户试图修复它,并且已经完成了一些修复(但从未发布)。请参阅 bug #38098Octave's wiki page on the database package 了解有关使其在 Octave 3.6.2 中与 SQLite 一起使用的一些报告。

        包的新版本是对包的完全重启。如果您能为 SQLite 绑定的开发做出贡献,那就太好了。

        【讨论】:

        • 当然没有问题,如果这是实现它的方法。虽然仍然有点菜鸟,所以可能需要一些建议。猜猜从 Octave-Forge 开发人员和 C++ API 文档页面开始,不是吗?
        • @PHC 如果您尝试将 SQLite 绑定实现到新版本,则这不是必需的。您只需要存储库的 URL,克隆它,然后开始 hack。查看它是如何为 postgreSQL 完成的,并在邮件列表中询问。当前的维护者是 Olaf Till。发送电子邮件时抄送他以防万一。
        【解决方案4】:

        查看此链接http://octave.1599824.n4.nabble.com/Octave-and-databases-td2402806.html,它提出了关于 MySQL 的相同问题。

        特别是 Martin Helm 的这个回复指出了使用 JDBC 连接到任何支持 JDBC 的数据库的方法 - “看看octave java包(octave-forge)中的java绑定,它是 维护,它的工作原理。 Java 非常强大且易于数据库处理。 使用它和 mysql 的 jdbc 驱动程序连接到 mysql(或使用 适当的 jdbc friver 你能想象到的一切)。这就是我 使用八度音程的数据库查询时执行此操作。比 调用脚本并解析数据库查询的输出。

        据我所知,数据库包不知何故坏了(至少我从来没有 能够使用它)。 "

        【讨论】:

          【解决方案5】:

          我知道这个帖子已经很老了,但是对于其他正在寻找类似解决方案的人来说,这个项目似乎提供了它。

          https://github.com/markuman/go-sqlite

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-15
            • 1970-01-01
            • 2014-02-08
            • 2017-11-11
            • 2016-06-05
            • 1970-01-01
            • 1970-01-01
            • 2011-06-30
            相关资源
            最近更新 更多