Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的简单Ruby SQLite3示例失败了?_Ruby_Database_Sqlite_Dbi - Fatal编程技术网

为什么我的简单Ruby SQLite3示例失败了?

为什么我的简单Ruby SQLite3示例失败了?,ruby,database,sqlite,dbi,Ruby,Database,Sqlite,Dbi,在我学习Ruby的过程中,我一直在阅读 大多数示例都很容易理解,这给了我一个很好的Ruby介绍,但是我无法轻松运行与DB相关的示例 我试图运行以下代码:(根据书中给出的示例稍微修改) 运行时,它会在数据库中插入一行,然后它会给出以下错误: /var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:41:in `bind_param': library routine called out of sequence (SQL

在我学习Ruby的过程中,我一直在阅读

大多数示例都很容易理解,这给了我一个很好的Ruby介绍,但是我无法轻松运行与DB相关的示例

我试图运行以下代码:(根据书中给出的示例稍微修改)

运行时,它会在数据库中插入一行,然后它会给出以下错误:

/var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:41:in `bind_param': library routine called out of sequence (SQLite3::MisuseException) from /var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:41:in `bind_params' from /var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:37:in `each' from /var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:37:in `bind_params' from /var/lib/gems/1.8/gems/dbd-sqlite3-1.2.5/lib/dbd/sqlite3/statement.rb:71:in `bind_params' from /var/lib/gems/1.8/gems/dbi-0.4.5/lib/dbi/handles/statement.rb:115:in `execute' from /media/dev/ruby-prax/moi.rb:12 from /media/dev/ruby-prax/moi.rb:11:in `upto' from /media/dev/ruby-prax/moi.rb:11 from /var/lib/gems/1.8/gems/dbi-0.4.5/lib/dbi/handles/database.rb:61:in `prepare' from /media/dev/ruby-prax/moi.rb:10 from /var/lib/gems/1.8/gems/dbi-0.4.5/lib/dbi/handles/driver.rb:41:in `connect' from /var/lib/gems/1.8/gems/dbi-0.4.5/lib/dbi.rb:148:in `connect' from /media/dev/ruby-prax/moi.rb:5 TABLE slugs already exists. /var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:41:在“bind_param”中:库例程被无序调用(sqlite3::MisuseException) from/var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:41:in'bind_params' from/var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:37:in'each' from/var/lib/gems/1.8/gems/sqlite3-ruby-1.3.2/lib/sqlite3/statement.rb:37:in'bind_params' from/var/lib/gems/1.8/gems/dbd-sqlite3-1.2.5/lib/dbd/sqlite3/statement.rb:71:in'bind_params' from/var/lib/gems/1.8/gems/dbi-0.4.5/lib/dbi/handles/statement.rb:115:in'execute' from/media/dev/ruby-prax/moi.rb:12 from/media/dev/ruby-prax/moi.rb:11:in'upto' from/media/dev/ruby-prax/moi.rb:11 from/var/lib/gems/1.8/gems/dbi-0.4.5/lib/dbi/handles/database.rb:61:in'prepare' from/media/dev/ruby-prax/moi.rb:10 from/var/lib/gems/1.8/gems/dbi-0.4.5/lib/dbi/handles/driver.rb:41:in'connect' from/var/lib/gems/1.8/gems/dbi-0.4.5/lib/dbi.rb:148:in'connect' from/media/dev/ruby-prax/moi.rb:5 表slug已经存在。 我现在使用的是Ubuntu 10.04。 版本信息:

tlee@tim-ubuntu:/media/dev/ruby-prax$ ruby -v ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux] tlee@tim-ubuntu:/media/dev/ruby-prax$ gem list *** LOCAL GEMS *** abstract (1.0.0) daemons (1.1.0) dbd-mysql (0.4.4) dbd-odbc (0.2.5) dbd-sqlite3 (1.2.5) dbi (0.4.5) deprecated (3.0.0, 2.0.1) erubis (2.6.6) eventmachine (0.12.10) extlib (0.9.15) json_pure (1.4.6) mysql (2.8.1) rack (1.2.1) sqlite3-ruby (1.3.2) thin (1.2.7) thor (0.14.1) tlee@tim-ubuntu:/media/dev/ruby-prax$ sqlite3 --version 3.6.22 tlee@tim-ubuntu:/media/dev/ruby-prax$ tlee@tim-ubuntu:/media/dev/ruby-prax$ruby-v ruby 1.8.7(2010-01-10 patchlevel 249)[x86_64-linux] tlee@tim-ubuntu:/media/dev/ruby prax$gem列表 ***本地宝石*** 摘要(1.0.0) 守护进程(1.1.0) dbd mysql(0.4.4) dbd odbc(0.2.5) dbd-sqlite3(1.2.5) dbi(0.4.5) 已弃用(3.0.0、2.0.1) erubis(2.6.6) eventmachine(0.12.10) extlib(0.9.15) json_pure(1.4.6) mysql(2.8.1) 机架(1.2.1) SQLite3Ruby(1.3.2) 薄(1.2.7) 雷神(0.14.1) tlee@tim-ubuntu:/media/dev/ruby prax$sqlite3——版本 3.6.22 tlee@tim-ubuntu:/media/dev/ruby prax$
我做错了什么?

您的表定义是:

slugs(name varchar(20), age int);
但您正在尝试插入:

st.execute("slug #{i}", "#{i}")
请注意,
“#{i}”
不是整数,而是字符串。将其更改为
i
,如本例所示:

st.execute("slug #{i}", i) 

然后看看会发生什么。

我也遇到了同样的问题。当您多次使用准备好的INSERT语句时,DBD的SQLite驱动程序会失败。就我个人而言,我接受了答案中的建议,即迁移到,因为Ruby/DBI显然不再被维护。迁移到RDBI只需要很少的代码更改。

我不知何故认为Ruby上的几个sqlite3库缺少语句类的reset和clear方法

当重复执行同一条SQL语句时,一条语句只准备一次,并使用一组新的值执行。但是,在执行语句之后和重新绑定之前,需要重置(并且经常清除)。关键是重置已用语句要比反复“编译和优化”同一个SQL更快。你们大多数人可能都知道这一切。。。但这里是指向相关部分的SQLite文档的链接:

我在SQLite3::Statement类中没有看到reset和clear方法,所以这个实现可能会遗漏这些方法,或者在重用时有一些其他机制可以自动重置/清除,但该机制不知何故没有被触发。但是,文档中甚至没有提到。。。至少我找不到它

我认为SQLite3::Statement类中缺少clear_绑定和reset方法


接得好!但是,在改变它之后,没有任何区别。我看到了完全相同的行为。事实上,对于sqlite3,无论我将列定义为varchar还是int,对于这种简单的插入似乎没有多大区别。我尝试使用slugs(名称、年龄),但仍然得到相同的错误。如果您尝试为“名称”传递数字,我希望它会给出相同的错误,因为这也是一种类型不匹配。Name必须是字符串,age必须是整数/fixnum。在测试时打开数据库时可能出现的另一个错误是,如果某个字段有“distinct”或“unique”子句,则该字段仅限于唯一值。尝试重新运行尝试插入顺序值的代码将使DB疯狂,强制在每次运行之前删除所有行。但我不认为您定义了任何带有“distinct”子句的字段。SQLite将列类型更像是提示,而不是要强制执行的严格规则。SQLite网站上有关于类型如何工作的文章。谢谢你,我来看看。RDBI仍然是个好主意吗?看起来这里并没有提交,但我不确定是因为项目被放弃了,还是因为几乎并没有bug,很少使用。
st.execute("slug #{i}", i)