ruby – 通过DataMapper从SQLite内存DB中没有这样的表错误
发布时间:2020-12-17 03:13:12 所属栏目:百科 来源:网络整理
导读:我有一个 Ruby程序,它使用DataMapper作为ORM来与内存中的SQLite DB进行通信.这一直很好,但我刚刚添加了一个新的DM类和相应的表.令我惊讶的是,在auto_migrate期间,事情现在爆炸了! 这是DataMapper生成的SQL: ~ (0.000390) PRAGMA table_info("sensationd_ch
我有一个
Ruby程序,它使用DataMapper作为ORM来与内存中的SQLite DB进行通信.这一直很好,但我刚刚添加了一个新的DM类和相应的表.令我惊讶的是,在auto_migrate期间,事情现在爆炸了!
这是DataMapper生成的SQL: ~ (0.000390) PRAGMA table_info("sensationd_channels") ~ (0.000010) PRAGMA table_info("sensationd_commands") ~ (0.000009) PRAGMA table_info("sensationd_configurations") ~ (0.000052) PRAGMA table_info("sensationd_measurements") ~ (0.000028) SELECT sqlite_version(*) ~ (0.000035) DROP TABLE IF EXISTS "sensationd_channels" ~ (0.000009) PRAGMA table_info("sensationd_channels") ~ (0.000423) CREATE TABLE "sensationd_channels" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"channel" INTEGER NOT NULL,"name" VARCHAR(50),"precision" INTEGER DEFAULT 11,"gain" INTEGER DEFAULT 1,"differential" BOOLEAN DEFAULT 'f',"configuration_id" INTEGER NOT NULL) ~ (0.000191) CREATE INDEX "index_sensationd_channels_configuration" ON "sensationd_channels" ("configuration_id") ~ (0.000015) DROP TABLE IF EXISTS "sensationd_commands" ~ (0.000009) PRAGMA table_info("sensationd_commands") ~ (0.000153) CREATE TABLE "sensationd_commands" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"action" INTEGER DEFAULT 1,"complete" BOOLEAN DEFAULT 'f',"issued_at" TIMESTAMP,"completed_at" TIMESTAMP) ~ (0.000015) DROP TABLE IF EXISTS "sensationd_configurations" ~ (0.000009) PRAGMA table_info("sensationd_configurations") ~ (0.000155) CREATE TABLE "sensationd_configurations" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"created_on" TIMESTAMP,"modified_on" TIMESTAMP,"name" VARCHAR(50) NOT NULL,"active" BOOLEAN) ~ (0.000015) DROP TABLE IF EXISTS "sensationd_measurements" ~ (0.000009) PRAGMA table_info("sensationd_measurements") ~ (0.000152) CREATE TABLE "sensationd_measurements" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"timestamp" TIMESTAMP,"measurement" VARCHAR(65535) NOT NULL,"channel_id" INTEGER NOT NULL,"channel_configuration_id" INTEGER NOT NULL) ~ (0.000175) CREATE INDEX "index_sensationd_measurements_channel" ON "sensationd_measurements" ("channel_id","channel_configuration_id") ~ (0.000083) SELECT "id","created_on","modified_on","name","active" FROM "sensationd_configurations" WHERE "active" = 't' ORDER BY "id" LIMIT 1 ~ (0.000073) INSERT INTO "sensationd_configurations" ("created_on","active") VALUES ('2011-08-01T12:36:18-07:00','2011-08-01T12:36:18-07:00','Test U6-Pro Configuration,differential.','t') ~ (0.000109) SELECT "id","action","complete","issued_at","completed_at" FROM "sensationd_commands" ORDER BY "issued_at" DESC LIMIT 1 ~ (0.000086) INSERT INTO "sensationd_channels" ("channel","precision","gain","differential","configuration_id") VALUES (0,'0',11,'t',1) ~ no such table: sensationd_commands (code: 1,sql state:,query: SELECT "id","completed_at" FROM "sensationd_commands" ORDER BY "issued_at" DESC LIMIT 1,uri: sqlite3::memory:?scheme=sqlite&user=&password=&host=&port=&query=&fragment=&adapter=sqlite3&path=:memory:) 看起来它创建表格很好,但之后几行就找不到了.我认为我错误配置了数据库连接,除了找到其他表并且工作正常. 正在使用的软件: > Ruby 1.9.2p289通过RVM 有谁知道为什么这会被扼杀,我能做些什么呢? 解决方法
问题是,我怀疑,由于线程池,DataMapper(或更准确地说,DataObjects,DataMapper使用的数据库驱动程序)会自动执行.线程之间不共享数据库连接.这对于像postgresql或mysql甚至sqlite3这样的“文件支持”数据库来说是好的(甚至是有益的).对于内存存储中的sqlite3,连接是数据库.因此,额外的线程将失败.此外,经过一段时间不活动(约1分钟?)后,线程将被清除,数据库也会消失.
如果是这样,我不确定是否有一个简单的解决方法.您可以修改do_sqlite3以避免这种情况.另一个应该基本上同样快的替代方案是在ramdrive上使用文件支持的sqlite3 DB. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |