SQLite 3 database not being read properly - ruby-on-rails

I had to create a sqlite3 database in my rails 3.1.1 app manually, converting from a mysql database using the mysql2sqlite tool, and then running:
sqlite3 development.sqlite3 < mysql2sqlite_dump.sql
Anyways, the development.sqlite3 file is there, and the server starts up fine and all the pages are loading fine (no database errors about missing tables or anything), but the data isn't being read... just as if it wasn't there. Even running Event.all, for example, in console gives me :
Event Load (0.1ms) SELECT "events".* FROM "events"
=> []
When there should actually be several events. Looking in the sqlite3 file, I can see that all the information is there, but it's just not being read. I will post part of the database file if anybody requests it.
My question is: Why isn't the database being read properly, and how can I make it so?
Thanks.

Well, I seemed to have solved the problem. The issue was that mysqldump (being executed inside of the mysql2sqlite script) was dropping and then creating the tables (which is default), and that was conflicting with the schema file. So, I created the database according the schema file, and then ran the script again with the --no-create-info option added for mysqldump so that it would only insert the information.
Thanks for the help everybody!

Related

Access to database tables location created with migrate in Rails

I did a homework on Rails using RubyMine.
I need to submit the homework with the database tables . But I can't access database tables file location, because I don't know under the which folder I created with migrate. I have migrated tables at the rubymine terminal
I used postgresql for database.
I will be so happy if you could help me. Thank you from now.
There is a schema.rb file that represents your database under db/ folder. So this is the answer for your first question.
The answer to second question is in order to deploy your code on a different computer, the third-party softwares need to be installed. In your scenario, this third-party is postgres as db server. To deploy your code, just type on your terminal rake db:setup. This command will create your database, run migrations and finally seed your database if db/seed.rb contains something. As a result, after rails s there should be some output.
It is worth to note that Rails is db agnostic framework. If you did not use postgres specific features then you would use mysql or sqlite on different computers/servers. But keep in mind that you should change the adapter from config/database.yml if you want to use another database.
Ödev sunumunda başarılar.

Rails -- working with an existing db, cannot run migrations without losing data

I am a beginner working with Rails 4.1. I am trying to integrate an existing sqlite3 db with my app in the development environment.
To try to get this to work, I've followed the steps listed at Joel Berghoff's blog (for MySQL):
Reference the db in config/database.yml
Run “rake db:schema:dump”
Convert schema.rb into db/migrate/001_create_database.rb
The issue I am facing is, whenever I run "rake db:migrate" the entire db refreshes and I lose all the pre-populated data. I got around this for awhile by running migrations first, then replacing the blank db that was generated with my pre-populated copy -- this allowed me to play around with my models in the rails console and see the data. However when I try to boot up the server on my local machine, I get a message that migrations are pending.
I am not quite sure what to do here...I've read that I should be seeding the db from "rake db:seed", but my existing db is quite large -- almost 1mm records, and when I attempted this (in albeit clumsy fashion) it ran for over 3 hours before I gave up. Any guidance on how to proceed is much appreciated!
Migrates should be used to create and changes the tables and fields, not load data, as you can see here Ruby on Rails Guides
If you want to import data you could do it on the seeds, but in your specific case it seems to me that you should create a dump from your origin database and load it on the target database.
Here is a tutorial sqlite3: how to import/export data from/to a file
sqllite3 and MySQL are different things. My guess is you think you are connected to sqllite db but in reality you are connected to an empty MySQL db.
Look into ActiveRecord migrations.
Here is a rails doc on ActiveRecord Migrations: http://guides.rubyonrails.org/migrations.html

Rails and SQlite3 - Migrations from SQlite3 to PostgreSQL

I am learning RoR using M Hartls Rails tutorial book. I am very much new to the world of databases. I created the application(simple one, just on 3rd chapter) and did my RSpec and made few static pages. I wanted to migrate from sqllite3 to postgres.
I changed the database.yml to postgres deleting the full sqlite3 specifications. Now I run my app it does not work? It says 'PG:' Error.
I need to first understand how the data is stored in sqlite? I searched the db directory and I could not find the development.rb or any database file (probably because I altered the database.yml file)
In this case, I did not enter any data as such,(it still does not work , gives me error) but generally, where does the data get stored? and since I changed the database.yml file to postgres, what will happen to the existing data?
what does rake db:migrate command do?
It would be great if someone gives a simple analogy or explanation is to how this is stored then finding a solution for this problem becomes much easier.
sqlite stores its data in files in a folder on your filesystem, using its own system of storage.
postgres will do a similar thing, but in a different folder, using a different system.
You will generally never touch these folders. You don't need to know where they are or how the dbms (database management system, eg sqlite or postgres) stores the data. All your interaction with your dbms will be done either via the terminal, or the dmbs's shell client (which you launch in the terminal aka the shell), or via a desktop client, or via your rails app's own connection with the dbms.
When you make a new rails project you need to create the database it will use. If you switch to using a different dbms then you will need to create a new database in that dbms for your app to use. Google how to do this.
If you have data in one dbms and you want to bring it into a different dbms then you will need to export it from the first dbms and import it into the second dbms. Google how to do this.
rake db:migrate will run any migrations which haven't been run in your current database (ie the one in your database.yml). Rails creates a table in your database to store which migrations have been run already: this is how it keeps track. It will fail if you haven't created the database yet.

Ruby: SQLite3::BusyException: database is locked:

Ran into this error message whilst developing tonight: SQLite3::BusyException: database is locked:
I have two models:
Podcasts have many Tracks
Tracks belong to Podcasts.
Podcast files are hosted on mixcloud.
To create a Podcast:
user submits a url for a podcast on mixcloud
rails app grabs json feed associated with url
json is used to set attributes (title, image etc) on the new Podcast object
I'm trying to get my rails app to take advantage of the fact that the json feed also details the names (and artists) of the Tracks that belong to this Podcast.
I thought the following before_validation method would automatically create all associated Tracks whenever we create a new Podcast.
class Podcast < ActiveRecord::Base
attr_accessible :mixcloud_url, :lots, :of, :other, :attrs
has_many :tracks
before_validation :create_tracks
def create_tracks
json = Hashie::Mash.new HTTParty.get(self.json_url)
json.sections.each do |section|
if section.section_type=="track"
Track.create(:name=>section.track.name, :podcast_id=>self.id)
end
end
end
end
How can I get round this? It looks like rails (or sqlite3) doesn't like me creating new instances of an associated model in this way. How else can I do this? I suspect this is as much a rails problem as an sqlite3 one. I can post more code if it's gonna help.
For anyone else encountering this issue with SQLite locking in development when a Rails console is open, try this:
Just run the following:
ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")
For me anyway, it appears to clear any transaction that the console was holding onto and frees up the database.
This is especially a problem for me when running delayed_job, which seems to fail at closing the transaction quite often.
SQLite is not really supposed to be used for concurrent access which is the issue you are running into here. You can try increasing the timeout in your database.yml file which may be a workaround for you in this case. However, I would recommend you switch to another database that supports multiple connections like MySQL or PgSQL.
For me...the issue I had was that it seemed that the Rails Console I had open for a while was locking up a connection with SQLite.
So once I exited that console, and restarted my webserver (Thin) it worked perfectly.
I tried #trisweb's suggestion but it didn't work for me.
I had the same
ActiveRecord::StatementInvalid: SQLite3::BusyException: database is
locked: INSERT INTO "users" ("created_at", "email", "name",
"password_digest", "updated_at") VALUES (?, ?, ?, ?, ?)"
issue. I tried every way around found in Google and I failed. The problem was solved for me when I closed my SQLite Database Browser.
Make sure you don't have 2 guards or several consoles running.
If you want make sure desperately see the "No Name's" answer above.
You can also try increasing pool:
for example:
change test section in your config/database.yml as below
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 50
timeout: 5000
Probably you have a Rails console open on another bash, if so you have to close it (ctrl+D).
actually for me, I found killing rails help to fix this problem.
use "ps aux | grep rails" to find out ongoing rails process id.
then use
"kill -9 [rails-pid]"
to kill processes.
Then it will work
It is most likely not related to rails code. Using at the same time the console with the sandbox option (rails console --sandbox), makes the problem systematic with SQLite, since the console is basically waiting to quit to rollback everything.
The solution above from #trisweb will not work in this case, but quitting the console will.
my trouble is: I opened a database management program named "DB Browser for SQlite". Closed this database management program, and problem solved.
Yes this is an old question and there are many answers on here already. But none of them worked for me, meaning it took me a long time to finally figure out the problem. I found what worked and will share it in case it is what might be causing the problem for you too.
I was using the SQLITE Browser (its a GUI database browser). I will refer to it as "GUI" here (to prevent confusion with the word browser being your localhost::8000 chrome browser or whatever.
http://sqlitebrowser.org/
I was monitoring what was being written to the database and had the GUI open while my rails app ran in my chrome browser. I would refresh the GUI to see if it was adding the data as I expected it to.
As a matter of debugging I had decided to delete a row from the SQLite GUI so I could see if my app would react appropriately to the row being missing now.
As it turns out, the SQLite Browser does not actually delete the row (causing confusion on my end as to why my app was acting like the row was still there, even though it was visually missing on the GUI). Anyway after 30 minutes of frustration I closed the SQLite GUI and then got a notice that asked if i wanted to save any changes to the database that I made. I naively clicked "No" and closed the app.
Apparently what happens is that the GUI then locked the database because there were rows in my database that had been sort of "soft-deleted" without committing to the delete. So the GUI was (for lack of a better term) holding the database in Limbo.
This explains why a) my app wasnt acting like the row was missing, because it hadn't actually been deleted yet, and B) explains why the database locked up. It was still waiting for me to commit the deletes.
So to solve the problem, I simply opened up the GUI once again and deleted the same row and then closed the GUI and this time I clicked "Yes" when asking to save changes to the database. It saved the delete and unlocked the database and now my app works!
I hope this helps someone else that might be having the same issue but was using the SQLite Browser GUI interface. This might be what is locking your database.
I had the same issue. For those with SQLite Database Browser. I did not need to close SQLite Database Browser. I only had to click the "Write Changes" button. It is highlighted and needs to not be highlighted.
SQLite has troubles with concurrency.
I changed sqlite on Postgresql and the issue is gone
This happens when you make any changes manually directly into the SQlite DB Browser (like delete a row or change the value of any column) and forget to save those changes. Any changes made need to be saved (ctrl + s). If not saved, SQLite locks the Database until u save those changes.
I did the same and my issue got resolved!
I was using DB Browser for SQLite and rails console simultaneously. Closing the DB Browser for SQLite fixed the issue for me.
try restarting the server
or closing any running rails console,
worked for me
Your .sqlite3 file must be saved.
Go to DB Browser for SQlite and make ctrl+s or File->Write Changes.
Try wrap cycle in a single transaction:
def create_tracks
json = Hashie::Mash.new HTTParty.get(self.json_url)
Track.transaction do
json.sections.each do |section|
if section.section_type=="track"
Track.create(:name=>section.track.name, :podcast_id=>self.id)
end
end
end
end
(see Track.transaction)
You may also have enabled threads when parallelizing your tests. Remember to disable the option in test/test_helper.rb :
parallelize(workers: :number_of_processors, with: :threads)
to
parallelize(workers: :number_of_processors)
https://edgeguides.rubyonrails.org/testing.html#parallel-testing-with-threads
1. bin/rails console
2. exit
Go into the rails console and type exit, and press enter.
Done!
Sadly, many of these solutions did not work for me.
I was lucky. Since this was happening while I was running tests, I just did a simple DROP and CREATE on the DB.
$ rake db:drop RAILS_ENV=test
Dropped database 'db/test.sqlite3'
$ rake db:create RAILS_ENV=test
Created database 'db/test.sqlite3'
$ rake db:migrate RAILS_ENV=test
== 20220310061725 Tables: migrating ======================================
....
== 20220310061725 Tables: migrated (0.0027s) =============================
...etc
Not the best solution, but it works in a pinch.
If this was in your development environment, and you HAD to do this, I would seriously invest in creating a data seed for your DBs so you can get up to speed again.
rake db:drop
rake db:create
rake db:migrate
rake db:seed
I'd like to talk about the case of rails controller opened.
In my own case, I had opened rails controller with the --sandbox option.
After reading that I had to close the rails console. Closing alone didn't fix it. I had to restart my PC to make sure all processes got terminated. That resolved it.

Why does rake db:migrate in Rails not add functions to the schema file?

I recently added some SQL functions to my database via a migrate, and they work perfectly fine. Code works, database works, tests don't. The schema.rb file is telling me that it's at the latest version (and it's correct), but it only contains definitions for tables and indexes, not the functions I added.
I added the functions via the "execute()" method in my migration, and need them in the test database for the RSpec tests to pass (company policy dictates that I can't commit this changes until this is fixed).
Does anyone know why this is happening, or how to fix it? I can manually go into the MySQL command line and add the functions, but then they're erased the next time someone does a db:test:prepare. I need a solution that can be automated.
Thanks for any help and replies,
-Mike Trpcic
schema.rb is the Ruby schema format and it doesn't support functions or many other more advanced features. Change the format to plain SQL (in environment.rb) and you should be good to go.
config.active_record.schema_format = :sql
Edit: After Mike's comment, I did a bit of digging. The Rake task to dump the schema calls into the ActiveRecord connection adapter for MySQL and Oracle. MySQL's isn't very smart and only dumps the table structure, ignoring everything else. PostgreSQL, SQLite, SQL Server and Firebird call out to a vendor-provided executable.
mysqldump doesn't support dumping stored procedures before version 5.0.13.
I looked around the Rails Lighthouse, but searching for open tickets there is far harder than it should be. If no one else has filed a bug on this, you might consider doing so, though without a patch, it's not likely anyone is going to work on it.

Resources