3

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

我正在考虑 RODBC 中的 RODBC 或 python 中的 sqlite3 包,但对于八度音程。

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

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

细节:

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

5 回答 5

1

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

因此,我想我会为任何试图通过 octave访问sqlite3 的人提供一个实用的答案;这样做实际上是微不足道的,我自己已经这样做了很多次。

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

sqlite3 database.sqlite < FileContainingQuery > 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

等等,瞧

于 2020-01-30T13:15:09.613 回答
0

正如你已经发现的,新版本的数据库包(2.0.0)只支持postgreSQL。然而,旧版本的包也支持 MySQL 和 SQLite(最后一个版本是1.0.4 版)。

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

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

于 2013-02-17T20:35:55.670 回答
0

查看此链接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 你可以想象的一切). 这就是我在使用八度音程的 db 查询时所做的. 比调用更容易和更少间接脚本和解析数据库查询的输出。

据我所知,数据库包不知何故坏了(至少我永远无法使用它)。"

于 2013-04-11T16:55:23.297 回答
0

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

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

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

于 2013-02-17T14:57:57.893 回答
0

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

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

于 2015-02-03T17:17:43.687 回答