최고의 루비 데이터베이스 액세스 - DBI 자습서 튜토리얼 2024년, 이 튜토리얼에서는 DBI 애플리케이션 아키텍처,설치,데이터베이스 연결,INSERT 작업,사용 문을,준비하고실행 사용,READ 작업,업데이트 작업,DELETE 작업,행정 업무,방법 I,방법 II,작업을 COMMIT,ROLLBACK 작업,데이터베이스를 분리,처리 오류,차단 방법,드라이버 별 기능 및 특성,예,를 배울 수 있습니다.
이 장에서는 데이터베이스에 액세스하는 데 루비를 사용하는 방법을 보여줍니다.루비 DBI 모듈은데이터베이스 독립적 인 인터페이스는 루비 스크립트 펄 DBI 모듈과 유사합니다.
DBI, 즉 데이터베이스 루비 데이터베이스 독립적 인 인터페이스 대신에 독립적 인 인터페이스. 기본 데이터베이스와 루비 코드 사이의 DBI는 쉽게 데이터베이스 전환을 구현할 수있는 추상화 계층을 제공합니다. 또한, 방법, 변수 및 기준의 세트를 정의하는 데이터베이스 독립적 일치 데이터베이스 인터페이스를 제공한다.
DBI는 다음과 상호 작용할 수있다 :
배경에서 사용할 수있는 모든 데이터베이스의 DBI 독립적. 오라클, MySQL은, 인포믹스를 사용하든, 당신은 DBI를 사용할 수 있습니다. 다음 차트는 명확하게이 점을 보여줍니다.
루비 DBI 일반적인 아키텍처는 두 개의 층을 사용한다 :
당신은 MySQL 데이터베이스에 액세스 할 루비 스크립트를 작성하려는 경우, 당신은 루비 MySQL의 모듈을 설치해야합니다.
# Ubuntu sudo apt-get install mysql-client sudo apt-get install libmysqlclient15-dev # Centos yum install mysql-devel
맥 OS는 다음과 같은 코드를 추가, ~ / .bash_profile에 또는 ~ / .profile 파일을 수정해야합니다 :
MYSQL=/usr/local/mysql/bin export PATH=$PATH:$MYSQL export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
또는 부드러운 연결을 사용 :
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
2003 년 11 월 설립에 대해 젬은 루비 1.9 버전의 루비 표준 라이브러리의 일부가되었다. 더 자세한 내용은 볼 수 있습니다 : 루비 루비 젬
DBI와 DBD-mysql을 설치 보석을 사용합니다 :
sudo gem install dbi sudo gem install mysql sudo gem install dbd-mysql
이 모듈은하는 DBD입니다 http://tmtm.org/downloads/mysql/ruby/를 다운로드합니다.
최신 패키지를 다운로드 한 후 디렉토리에 압축을 풀고 설치하려면 다음 명령을 실행합니다 :
% ruby extconf.rb 或者 % ruby extconf.rb --with-mysql-dir=/usr/local/mysql 或者 % ruby extconf.rb --with-mysql-config
그런 다음 컴파일
% make
구하여 루비 / DBI 설치
당신은 다운로드하여 다음 링크에서 루비 DBI 모듈을 설치할 수 있습니다 :
https://github.com/erikh/ruby-dbi |
설치를 시작하기 전에, 당신이 루트 권한을 가지고 있는지 확인하십시오. 이제 설치하려면 다음 단계를 설치 :
1 단계
git clone https://github.com/erikh/ruby-dbi.git
직접 다른 압축 및 압축 해제에서.
2 단계
디렉토리루비 DBI 마스터를입력한디렉토리에setup.rb구성 스크립트를 사용합니다. 가장 일반적인 구성 명령은 임의의 파라미터 설정 매개 변수에 따라되지 않습니다. 기본 구성 명령은 모든 드라이버를 설치합니다.
$ ruby setup.rb config
보다 구체적으로는, 당신은 당신이 사용하려는 특정 부분을 나열 --with 옵션을 사용할 수 있습니다. 메인 DBI 모듈과 MySQL의 DBD 층 드라이브를 구성 할 경우, 예를 들어, 다음 명령을 입력 :
$ ruby setup.rb config --with=dbi,dbd_mysql
3 단계
마지막 단계는 설치하려면 다음 명령을 사용하여 드라이브를 만드는 것입니다 :
$ ruby setup.rb setup $ ruby setup.rb install
우리가 데이터베이스에 연결하기 전에 MySQL 데이터베이스를 사용하는 가정, 확인이 있는지 확인 :
MySQL 데이터베이스 연결 "TESTDB"의의 예 :
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") # 获取服务器版本字符串,并显示 row = dbh.select_one("SELECT VERSION()") puts "Server version: " + row[0] rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure # 断开与服务器的连接 dbh.disconnect if dbh end
이 스크립트를 실행하면 리눅스 시스템에서 다음과 같은 결과를 생성합니다.
Server version: 5.0.45
데이터 소스 반환 데이터베이스 핸들 (데이터베이스 핸들)과의 연결을 설정하고, 이후의 사용을위한DBH에 저장하거나, DBH는전무값e.err전자로설정 될 경우:오류 코드와 에러를 반환errstr을문자열입니다.
마지막으로,이 프로그램을 종료하기 전에, 데이터베이스 연결, 자원의 석방을 닫아야합니다.
당신이 데이터베이스 테이블에서 레코드를 생성 할 때 INSERT 작업을 사용합니다.
데이터베이스 연결되면 우리 테이블을 생성하거나DO를 이용하여 기록 방법을 생성하기 위해 테이블에 데이터를 삽입하거나 준비방법을실행할준비가 된 것이다.
성명은 데이터베이스 처리방법을 호출하여 행을 반환하지 않습니다.이 방법은 문 문자열 매개 변수를 사용하여 문에 의해 영향을받는 행의 수를 반환합니다.
dbh.do("DROP TABLE IF EXISTS EMPLOYEE") dbh.do("CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )" );
마찬가지로, 당신은 EMPLOYEE 테이블에 레코드를생성하는SQLINSERT문을 실행할 수 있습니다.
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)" ) puts "Record has been created" dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
당신은 루비 코드 SQL 문을 실행하는 데 DBI의준비와실행 방법을 사용할 수 있습니다.
다음과 같이 레코드를 만들려면 :
다음은이 두 가지 방법의 구문은 다음과 같습니다
sth = dbh.prepare(statement) sth.execute ko. zero or more SQL operations ko. sth.finish
두 방법은 SQL 문을 통과 할 값을결합하는데 사용될 수있다.경우에 입력되는 값은,이 경우 값을 결합하는 데 사용되는 사전에 부여 될 수 없다. 물음표를 사용(?) 대신 실제 값으로, 실제 값은 () API를 실행을 통해 전달합니다.
다음 예는 EMPLOYEE 테이블에 두 개의 레코드를 작성합니다 :
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES (?, ?, ?, ?, ?)" ) sth.execute('John', 'Poul', 25, 'M', 2300) sth.execute('Zara', 'Ali', 17, 'F', 1000) sth.finish dbh.commit puts "Record has been created" rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
여러 INSERT를 사용하는 경우, 먼저 문을 준비하고 훨씬 더 효율적으로 할 호출보다 각 사이클을 통해 루프에서 여러 번 실행합니다.
모든 데이터베이스에 대한 읽기 작업은 데이터베이스에서 유용한 정보를 얻을 의미한다.
데이터베이스 연결되면, 우리는 데이터베이스를 조회 할 준비가되었습니다. 우리는 방법을 사용하거나준비하고 데이터베이스 테이블에서 값을 얻을 방법을 실행않습니다.
다음 단계는 기록하기 :
다음 예제 쿼리는 모든 임금 (급여)는 EMPLOYEE 테이블에서 1,000 명 이상을 기록했다.
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("SELECT * FROM EMPLOYEE WHERE INCOME > ?") sth.execute(1000) sth.fetch do |row| printf "First Name: %s, Last Name : %s\n", row[0], row[1] printf "Age: %d, Sex : %s\n", row[2], row[3] printf "Salary :%d \n\n", row[4] end sth.finish rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure # 断开与服务器的连接 dbh.disconnect if dbh end
이것은 다음과 같은 결과를
First Name: Mac, Last Name : Mohan Age: 20, Sex : M Salary :2000 First Name: John, Last Name : Poul Age: 25, Sex : M Salary :2300
데이터베이스 갱신 동작은 하나 이상의 데이터베이스 갱신 기존 레코드를 말한다. 다음의 예는 SEX 모든 레코드에 대한 'M'입니다 업데이트합니다. 여기, 우리는 올해 모든 남성의 나이를 추가합니다. 그것은 세 단계로 구분됩니다
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ?") sth.execute('M') sth.finish dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
데이터베이스에서 레코드를 삭제할 때 DELETE 작업을 사용합니다. 다음 예는 EMPLOYEE의 모든 기록을 통해 AGE (20)을 삭제합니다. 다음과 같이 작업 단계는 다음과 같습니다
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("DELETE FROM EMPLOYEE WHERE AGE > ?") sth.execute(20) sth.finish dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
트랜잭션은 트랜잭션 일관성을 보장하는 메커니즘이다. 서비스는 다음 네 가지 특성을가집니다 :
DBI는 트랜잭션을 수행하는 두 가지 방법을 제공합니다. 하나는 커밋 또는 트랜잭션을 롤백 할 수있는커밋또는롤백방법이다. 또한 거기되는거래방법은 트랜잭션을 실행하기 위해 사용될 수있다. 다음에 우리는 트랜잭션을 구현하는 두 가지 간단한 방법을 소개합니다 :
첫 번째 방법은 명시 적으로 커밋 또는 트랜잭션을 취소 DBI의커밋과롤백 방법을 사용합니다 :
dbh['AutoCommit'] = false # 设置自动提交为 false. begin dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'") dbh.commit rescue puts "transaction failed" dbh.rollback end dbh['AutoCommit'] = true
두 번째 방법은거래방법을 사용한다. 이 트랜잭션이 문을 포함한 코드 블록을 구성하는 필요하기 때문에이 방법은 비교적 간단하다. 자동커밋또는롤백호출처리 방법은,블록을 실행하고, 그 블록이 성공적으로 실행된다:
dbh['AutoCommit'] = false # 设置自动提交为 false dbh.transaction do |dbh| dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'") end dbh['AutoCommit'] = true
커밋이 동작은 데이터베이스 변경을 식별 완료되고,이 동작 후에, 모든 변화는 회수되지 않는다.
다음은 간단한 예제는 메소드 호출을커밋합니다.
dbh.commit
당신은 하나 또는 몇 변화에 만족하지 않는 경우, 당신은 완전히 이러한 변경을 복원롤백 방법을 사용하고 싶습니다.
여기에롤백 (rollback) 메서드 호출의 간단한 예입니다.
dbh.rollback
데이터베이스 연결을 해제하려면 해제 API를 사용합니다.
dbh.disconnect
사용자가 데이터베이스 연결 해제 방법을 닫을 경우, DBI 모두 완료되지 않은 트랜잭션을 롤백합니다. 그러나, 어떤 DBI의 구현 정보에 의존하지 않고, 응용 프로그램이 커밋 또는 롤백 할 수있는 좋은 명시 적으로 호출 할 수 있습니다.
오류의 다양한 소스가 있습니다. 예를 들어, 구문 SQL 문의 구현에 오류 또는 연결이 실패하거나 완전한 문장 또는 취소 된 핸들 호출 방법을 가져.
DBI 방법이 실패 할 경우, DBI 예외가 발생합니다. DBI 방법은 예외의 모든 유형을 발생시킬 수 있지만, 가장 중요한 예외 클래스DBI :: InterfaceError및DBI :: DatabaseError의 것이다.
이러한 클래스의 예외 객체가ERR,errstr에 세 가지 속성과상태이며,서브 테이블에 오류 번호, 설명 오류 문자열 및 표준 오류 코드를 나타냅니다. 다음과 같이 지정 속성 :
위의 예에서, 당신은 다음과 같은 코드를 본 적이 :
rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
스크립트가 실행될 때, 사용자가 추적 할 수 있도록 수행되는 스크립트의 내용에 대한 디버그 정보를 획득한다. 이 작업을 수행하려면 먼저 DBI / 추적 모듈을 다운로드 한 다음 제어 모드와 출력 위치추적 방법을추적 호출해야합니다 :
require "dbi/trace" kokokokokokoko trace(mode, destination)
모드 값 0 (OFF), 1, 2, 또는 3, 대상의 값이 IO 객체되어야 할 수있다. 디폴트 값은 2 STDERR이다.
핸들을 만들 수있는 방법이 있습니다. 이러한 방법은 코드 블록이 호출됩니다. 상기 방법으로 코드 블록을 사용하는 장점은, 블록이 자동으로 해제 핸들을 종료 인수로 블록에 대한 핸들을 제공한다는 것이다. 다음은이 개념을 이해하는 데 도움이되는 몇 가지 예입니다.
DBI.connect 그것을 데이터베이스 핸들을 통과 코드 블록을 가질 수 있고, 손잡이는 자동적으로 블록의 끝에서 분리된다.
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") do |dbh|
dbh.prepare는 문 손잡이를 전달하는 코드 블록을 가지고 있고, 자동 블록의 끝 마무리를 호출 할 수있다.
dbh.prepare("SHOW DATABASES") do |sth| sth.execute puts "Databases: " + sth.fetch_all.join(", ") end
dbh.execute는 문 손잡이를 전달하는 코드 블록을 가지고 있고, 자동 블록의 끝 마무리를 호출 할 수있다.
dbh.execute("SHOW DATABASES") do |sth| puts "Databases: " + sth.fetch_all.join(", ") end
DBI 거래방법은 또한 상기 부분에서 앞서 설명한 않은 코드 블록으로 제공 될 수있다.
DBI 데이터베이스 드라이버가 추가 기능을 특정 데이터베이스를 제공하자,이 기능은 사용자의FUNC방법 핸들 객체에 의해 호출 할 수 있습니다.
설정 또는 속성을 특정 드라이버를 얻으려면[] = 또는 []방법을 사용합니다.
DBD :: mysql을 특정 드라이버 다음과 같은 기능을 구현합니다
아니오. | 기능 및 설명 |
---|---|
(1) | dbh.func (: CREATEDB, DB_NAME) 새 데이터베이스를 만듭니다. |
이 | dbh.func (: dropdb의, DB_NAME) 데이터베이스를 삭제합니다. |
3 | dbh.func (: 다시로드) 작업을 다시로드합니다. |
4 | dbh.func (: 종료) 서버를 종료합니다. |
(5) | dbh.func (: INSERT_ID) => Fixnum이라는 연결의 최근의 AUTO_INCREMENT 값을 돌려줍니다. |
6 | dbh.func (: CLIENT_INFO) => 문자열 필요에 따라 MySQL의 클라이언트 버전 정보를 돌려줍니다. |
(7) | dbh.func (: client_version) => Fixnum이라는 다시 클라이언트 버전 정보에 따라. CLIENT_INFO 유사하지만, 오히려 문자열을 반환보다는 Fixnum이라는를 반환합니다 때문입니다. |
8 | dbh.func (: host_info) => 문자열 호스트 정보를 반환합니다. |
9 | dbh.func (: proto_info) => Fixnum이라는 통신에 사용되는 프로토콜을 돌려줍니다. |
(10) | dbh.func (: server_info) => 문자열 기반의 MySQL 서버 버전 정보를 돌려줍니다. |
(11) | dbh.func (: 합계) => Stringb > 데이터베이스의 현재 상태를 리턴한다. |
(12) | dbh.func (: thread_id) => Fixnum이라는 현재의 thread의 ID를 돌려줍니다. |
#!/usr/bin/ruby require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") puts dbh.func(:client_info) puts dbh.func(:client_version) puts dbh.func(:host_info) puts dbh.func(:proto_info) puts dbh.func(:server_info) puts dbh.func(:thread_id) puts dbh.func(:stat) rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure dbh.disconnect if dbh end
이것은 다음과 같은 결과를
5.0.45 50045 Localhost via UNIX socket 10 5.0.45 150621 Uptime: 384981 Threads: 1 Questions: 1101078 Slow queries: 4 \ Opens: 324 Flush tables: 1 Open tables: 64 \ Queries per second avg: 2.860