2013-03-15 1 views
4

"rails console --sandbox"를 실행할 때 데이터베이스에 삽입을 볼 수 없습니다. 내가 옵션을 끄고 나면 내 개발 데이터베이스의 데이터를 잘 볼 수 있습니다. 콘솔의 모든 것이 똑같이 작동하는 것 같습니다. Hartl의 레일 튜토리얼에서 postgreSQL을 사용하고 있습니다. 나는 각 데이터베이스, 개발, 테스트, 포스트그레스를 조사했다. 그러나 콘솔을 사용하여 만든 데이터를 찾을 수 없습니다. 내가 bundel를 사용하고, 나는 여기에 레일즈 3 콘솔 --sandbox는 어떤 DB를 사용합니까?

내 database.yml을입니다 함께 밖으로 "번들 간부"로 시도 :

development: 
    adapter: postgresql 
    encoding: unicode 
    database: sample_app_development 
    pool: 5 
    timeout: 5000 
    username: user 
    password: 

test: 
    adapter: postgresql 
    encoding: unicode 
    database: sample_app_test 
    pool: 5 
    timeout: 5000 
    username: user 
    password: 

나는이 중요하지하지만 난 단지에서 무슨 일이 일어나고 있는지 매우 궁금 가정 여기 커버.

덕분에, 마크

+0

중복되지 않지만 => http://stackoverflow.com/questions/3340680/rails-script-console-vs-script-console-sandbox – Zippie

답변

6

콘솔은 샌드 박스 모드에서 하나의 큰 트랜잭션으로 작동하기 때문에 콘솔을 통해서만 삽입 할 수 있습니다.

콘솔이 아닌 다른 방법으로 db에 연결하는 경우 다른 연결을 사용하게되며 콘솔이 수행중인 작업은 아직 커밋되지 않았기 때문에 해당 연결에서 숨겨집니다.

트랜잭션을 사용하여 데이터베이스에 연결하면 다른 데이터베이스 연결은 트랜잭션이 커밋 될 때까지 변경 사항을 볼 수 없습니다. 트랜잭션 (이 경우 샌드 박스 콘솔)과의 연결은 롤백 전에 데이터베이스에 대한 변경 사항을 볼 수있는 유일한 연결입니다.

+0

감사! 그건 완벽하게 이해가됩니다. – Mark

+0

위대한 설명 – Gerep

+0

이 샌드 박스 모드에서 콜백 (예 : 이메일 보내기)을 실행합니까? –

5

당신은 --sandbox 옵션을 사용하여 데이터베이스에 저장 아무것도 볼 수 없을거야. 이 모드로 변경 한 내용은 콘솔을 종료 할 때 되돌릴 수 있습니다.

이 옵션을 사용하여 콘솔을 시작

당신이 읽을 수 있습니다 : 다시 시도하면 다시 종료에 출시 될 예정 만들 모든 수정

더 많은 정보

당신은 전에 SAVEPOINT active_record_1를 볼 수 있습니다 삽입물 바로 다음에 표시됩니다. RELEASE SAVEPOINT active_record_1

이 두 링크를 읽으면 어떤 일이 벌어지고 있는지 더 잘 알 수 있습니다. http://www.postgresql.org/docs/8.1/static/sql-savepoint.html http://www.postgresql.org/docs/9.1/static/sql-release-savepoint.html

더 많은 정보를 원하시면 2 =) 당신이 그 두 개의 링크에서 볼 수 있듯이

은, PostgreSQL을가하는 SAVEPOINT을 생성 객체 다음 RELEASE SAVEPOINT 저장합니다. 이 데이터를 영구히 저장하지 않습니다. 이것은 --sandbox을 사용하는 방법이 아닙니다 (IMO). 데이터가 저장되고 그 직후에 "릴리스 됨". 모델, 검증 등의 관계가 괜찮은지 확인하기위한 테스트 목적으로 사용됩니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 보았지만 결과에 따르면 종료 할 때 롤백하기 전에 DB에 실제로 삽입하는 것으로 보입니다. 이 모드에서 삽입 및 롤백을 "위장"하고 DB에 실제로 쓰지 않았습니까? 사실 튜토리얼에서는 실제로 DB의 레코드를보고 명령 결과를 확인하는 것이 좋습니다. 한가지 차이점은 SQLite는 DB라고 가정하고 Postgres로 전환했습니다. – Mark

+0

** 추가 정보 ** 후속 질문 : 다시 한 번 감사드립니다. 사실은 매우 잘 알고 있습니다. 그러나, 나는 처음에 내 사건을 아주 잘 설명했다고 생각하지 않는다. 나는 (롤백하기 전에) 콘솔에서 빠져 나와 DB에있는 데이터를 볼 것으로 예상되지만 삽입되지 않은 데이터를 찾고 있습니다. – Mark