Latest web development tutorials
×

Ruby หลักสูตร

Ruby หลักสูตร Ruby แนะนำโดยย่อ Ruby สิ่งแวดล้อม Ruby ติดตั้ง Linux Ruby ติดตั้ง Windows Ruby การเข้ารหัสจีน Ruby เลือกบรรทัดคำสั่ง Ruby ตัวแปรสภาพแวดล้อม Ruby ไวยากรณ์ Ruby ชนิดข้อมูล Ruby คลาสและวัตถุ Ruby กรณีระดับ Ruby ตัวแปร Ruby ผู้ประกอบการ Ruby หมายเหตุ Ruby เงื่อนไข Ruby การไหลเวียน Ruby ทาง Ruby กลุ่ม Ruby โมดูล Ruby เชือก Ruby แถว Ruby กัญชา Ruby วันที่และเวลา Ruby ขอบเขต Ruby iterator Ruby input และ output ไฟล์ Ruby File ชั้นเรียนและวิธี Ruby Dir ชั้นเรียนและวิธี Ruby ผิดปกติ

Ruby การสอนที่ทันสมัย

Ruby เชิงวัตถุ Ruby นิพจน์ปกติ Ruby การเข้าถึงฐานข้อมูล - DBI หลักสูตร Ruby MySQL Ruby CGI โครงการ Ruby CGI ทาง Ruby CGI Cookies Ruby CGI Sessions Ruby ส่ง Email SMTP Ruby Socket โครงการ Ruby XML, XSLT, XPath Ruby Web Services Ruby multithreading Ruby JSON Ruby RubyGems

การเข้าถึงฐานข้อมูลทับทิม - DBI กวดวิชา

บทนี้จะแสดงวิธีการใช้ทับทิมการเข้าถึงฐานข้อมูลโมดูลทับทิม DBIมีอินเตอร์เฟซที่ใช้ฐานข้อมูลที่เป็นอิสระมีความคล้ายคลึงกับโมดูล Perl DBI สคริปต์ทับทิม

DBI คือฐานข้อมูลอินเตอร์เฟซที่เป็นอิสระในนามของอินเตอร์เฟซที่ใช้ฐานข้อมูลอิสระทับทิม DBI ระหว่างรหัสทับทิมกับฐานข้อมูลต้นแบบให้ชั้นนามธรรมที่ช่วยให้คุณสามารถใช้การเปลี่ยนแปลงฐานข้อมูล มันกำหนดชุดของวิธีการตัวแปรและบรรทัดฐานที่มีอินเตอร์เฟซฐานข้อมูลฐานข้อมูลอิสระที่สอดคล้องกัน

DBI สามารถโต้ตอบกับต่อไปนี้:

  • ADO (วัตถุข้อมูล ActiveX)
  • DB2
  • FrontBase
  • mSQL
  • MySQL
  • ODBC
  • คำพยากรณ์
  • oci8 (Oracle)
  • PostgreSQL
  • Proxy Server /
  • SQLite
  • SQLRelay

สถาปัตยกรรมสมัคร DBI

อิสระ DBI ของฐานข้อมูลใด ๆ ที่มีอยู่ในพื้นหลัง ไม่ว่าคุณจะใช้ Oracle, MySQL, Informix, คุณสามารถใช้ DBI แผนภูมิต่อไปนี้แสดงให้เห็นอย่างชัดเจนถึงจุดนี้

สถาปัตยกรรมทับทิม DBI

ทับทิม DBI สถาปัตยกรรมทั่วไปใช้สองชั้น:

  • ฐานข้อมูล Interface (DBI) ชั้น ชั้นนี้จะเป็นฐานข้อมูลที่เป็นอิสระและมีชุดของวิธีการเข้าถึงของประชาชนโดยใช้เซิร์ฟเวอร์ฐานข้อมูลไม่คำนึงถึงประเภทของวิธีการ
  • ไดรเวอร์ฐานข้อมูล (DBD) ชั้น ชั้นนี้จะขึ้นอยู่กับฐานข้อมูลไดรฟ์ที่แตกต่างกันให้การเข้าถึงเครื่องมือฐานข้อมูลที่แตกต่างกัน MySQL, PostgreSQL, InterBase, Oracle, ตามลำดับใช้ไดรฟ์ที่แตกต่างกัน คนขับแต่ละคนเป็นผู้รับผิดชอบสำหรับการตีความการร้องขอจากชั้น DBI และคำขอเหล่านี้จะถูกแมปที่จะนำไปใช้กับการร้องขอสำหรับชนิดที่กำหนดของเซิร์ฟเวอร์ฐานข้อมูล

ติดตั้ง

หากคุณต้องการที่จะเขียนสคริปต์ทับทิมในการเข้าถึงฐานข้อมูล MySQL, คุณจำเป็นต้องติดตั้งโมดูลทับทิม MySQL

ชุดติดตั้ง Mysql การพัฒนา

# Ubuntu
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient15-dev

# Centos
yum install mysql-devel

Mac 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

ใช้ติดตั้ง RubyGems DBI (แนะนำ)

RubyGems เกี่ยวกับการก่อตั้งขึ้นในเดือนพฤศจิกายนปี 2003 กลายเป็นส่วนหนึ่งของห้องสมุดมาตรฐานทับทิมทับทิมจากรุ่น 1.9 รายละเอียดเพิ่มเติมสามารถดูได้ที่: ทับทิม RubyGems

ใช้อัญมณีติดตั้ง DBI และ DBD-MySQL:

sudo gem install dbi
sudo gem install mysql
sudo gem install dbd-mysql

การติดตั้งใช้รหัส (รุ่นทับทิมน้อยกว่า 1.9 ใช้วิธีนี้)

โมดูลเป็น 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

ก่อนที่จะเริ่มการติดตั้งให้แน่ใจว่าคุณมีสิทธิ์ root ตอนนี้ติดตั้งขั้นตอนต่อไปจะติดตั้ง:

ขั้นตอนที่ 1

git clone https://github.com/erikh/ruby-dbi.git

หรือโดยตรงภายใต้การไปรษณีย์และเปิดเครื่องรูดอีก

ขั้นตอนที่ 2

ใส่ไดเรกทอรีทับทิม DBI-Master ใช้สคริปต์การกำหนดค่าsetup.rb ในไดเรกทอรี คำสั่งการตั้งค่าทั่วไปส่วนใหญ่จะไม่ตามมาด้วยการกำหนดค่าพารามิเตอร์พารามิเตอร์ใด ๆ คำสั่งกำหนดค่าเริ่มต้นในการติดตั้งไดรเวอร์ทั้งหมด

$ ruby setup.rb config

โดยเฉพาะอย่างยิ่งคุณสามารถใช้ตัวเลือก --with to list ส่วนเฉพาะที่คุณต้องการใช้ ตัวอย่างเช่นถ้าคุณต้องการกำหนดค่าโมดูล DBI หลักและไดรฟ์ชั้น MySQL DBD ป้อนคำสั่งต่อไปนี้:

$ ruby setup.rb config --with=dbi,dbd_mysql

ขั้นตอนที่ 3

ขั้นตอนสุดท้ายคือการสร้างไดรฟ์ให้ใช้คำสั่งต่อไปนี้จะติดตั้ง:

$ ruby setup.rb setup
$ ruby setup.rb install

เชื่อมต่อฐานข้อมูล

สมมติว่าเรากำลังใช้ฐานข้อมูล MySQL ก่อนที่จะเชื่อมต่อกับฐานข้อมูลตรวจสอบให้แน่ใจว่า

  • คุณได้สร้างฐานข้อมูล testdb
  • คุณได้สร้างตารางพนักงานใน TestDB
  • ตารางที่มีข้อมูล FIRST_NAME, LAST_NAME อายุเพศและรายได้
  • ตั้งรหัสผู้ใช้ "testuser" และรหัสผ่าน "test123" ในการเข้าถึง TestDB
  • แล้วบนเครื่องของคุณอย่างถูกต้องติดตั้งโมดูลทับทิม DBI
  • คุณเคยเห็น MySQL กวดวิชาเข้าใจ 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

เมื่อคุณเรียกใช้สคริปต์นี้จะให้ผลลัพธ์ที่ต่อไปนี้บนเครื่อง Linux

Server version: 5.0.45

ถ้าคุณสร้างการเชื่อมต่อกับแหล่งข้อมูลที่จัดการฐานข้อมูลกลับ (ฐานจับ) และบันทึกไว้ในDBH สำหรับใช้ในภายหลังหรือ DBHจะถูกตั้งค่าศูนย์e.err และe :: errstrกลับรหัสข้อผิดพลาดและข้อผิดพลาด เชือก

สุดท้ายก่อนออกจากโปรแกรมนี้ให้แน่ใจว่าได้ปิดการเชื่อมต่อฐานข้อมูลการเปิดตัวของทรัพยากร

ดำเนินการแทรก

เมื่อคุณต้องการสร้างบันทึกในตารางฐานข้อมูลคุณต้องใช้การแทรก

เมื่อเชื่อมต่อฐานข้อมูลเราพร้อมที่จะสร้างตารางหรือใส่ข้อมูลในตารางในการสร้างวิธีการบันทึกโดยใช้ทำหรือเตรียมความพร้อมและดำเนินการวิธีการ

ใช้ทำคำสั่ง

คำสั่งไม่กลับแถวโดยการเรียกทำวิธีการประมวลผลฐานข้อมูลวิธีการนี้ใช้พารามิเตอร์สตริงคำสั่งและส่งกลับจำนวนแถวรับผลกระทบจากคำสั่ง

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 )" );

ทำนองเดียวกันคุณสามารถดำเนินการคำสั่ง INSERTSQL เพื่อสร้างบันทึกลงในตารางการทำงานของพนักงาน

#!/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

ใช้เตรียมความพร้อมและดำเนินการ

คุณสามารถใช้ DBIของการเตรียมความพร้อมและดำเนินการวิธีการที่จะดำเนินทับทิมงบSQL รหัส

เพื่อสร้างบันทึกดังนี้

  • คำสั่ง SQL จัดทำขึ้นด้วยคำสั่ง INSERTนี้จะทำได้โดยการใช้วิธีการเตรียมความพร้อม
  • ดำเนินการแบบสอบถาม SQL เลือกผลการค้นหาทั้งหมดจากฐานข้อมูลนี้จะทำได้โดยการใช้วิธีการดำเนินการ
  • ข่าวจับคำสั่งนี้จะทำได้ผ่านการใช้งานของการเสร็จสิ้นของ API
  • หากทุกอย่างไปแล้วการดำเนินการกระทำหรือคุณสามารถดำเนินการย้อนกลับการทำธุรกรรม

นี่คือไวยากรณ์ของทั้งสองวิธีนี้:

sth = dbh.prepare(statement)
sth.execute
   ... zero or more SQL operations ...
sth.finish

ทั้งสองวิธีสามารถนำมาใช้ในการผูกค่าการส่งผ่านคำสั่ง SQLบางครั้งค่าที่ถูกป้อนอาจไม่ได้รับล่วงหน้าในกรณีนี้จะใช้ในการผูกค่า ใช้เครื่องหมายคำถาม(?) แทนค่าจริงค่าจริงผ่านรัน () API

ตัวอย่างต่อไปนี้สร้างสองระเบียนในตารางพนักงาน:

#!/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

ถ้าคุณใช้หลายแทรกแล้วครั้งแรกที่จัดทำงบและจากนั้นดำเนินการหลายครั้งในห่วงผ่านแต่ละรอบกว่าจะเรียกทำมีประสิทธิภาพมากขึ้น

การดำเนินการอ่าน

การดำเนินการอ่านบนฐานข้อมูลใด ๆ หมายถึงการได้รับข้อมูลที่เป็นประโยชน์จากฐานข้อมูล

เมื่อเชื่อมต่อฐานข้อมูลเราก็พร้อมที่จะสืบค้นฐานข้อมูลเราสามารถใช้วิธีการหรือไม่ดำเนินการเตรียมความพร้อมและวิธีการที่จะได้รับความคุ้มค่าจากตารางฐานข้อมูล

ได้รับขั้นตอนการบันทึกไว้ดังต่อไปนี้:

  • ตามเงื่อนไขที่จำเป็นสำหรับการเตรียมความพร้อมของคำสั่งของ SQLนี้จะทำได้โดยการใช้วิธีการเตรียมความพร้อม
  • ดำเนินการแบบสอบถาม SQL เลือกผลการค้นหาทั้งหมดจากฐานข้อมูลนี้จะทำได้โดยการใช้วิธีการดำเนินการ
  • หนึ่งโดยหนึ่งที่จะได้รับผลและผลผลนี้จะทำได้โดยการใช้วิธีการดึงข้อมูล
  • ข่าวจับคำสั่งนี้จะทำได้โดยการใช้วิธีการเสร็จสิ้น

แบบสอบถามตัวอย่างต่อไปนี้ทุกค่าจ้าง (เงินเดือน) ที่บันทึกมากกว่า 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

มีหลายวิธีที่จะได้รับการบันทึกจากฐานข้อมูลหากคุณสนใจที่คุณสามารถดูมี การดำเนินงานทับทิม DBI อ่าน

การดำเนินการปรับปรุง

ดำเนินการใด ๆ การอัพเดตฐานข้อมูลหมายถึงระเบียนที่มีอยู่หนึ่งหรือมากกว่าปรับปรุงฐานข้อมูล ตัวอย่างต่อไปนี้การปรับปรุงมีเพศสัมพันธ์เป็น 'M' สำหรับระเบียนทั้งหมด ที่นี่เราจะเพิ่มปีทุกเพศอายุ มันจะถูกแบ่งออกเป็นสามขั้นตอน

  • ตามเงื่อนไขที่จำเป็นสำหรับการเตรียมความพร้อมของคำสั่งของ SQLนี้จะทำได้โดยการใช้วิธีการเตรียมความพร้อม
  • ดำเนินการแบบสอบถาม SQL เลือกผลการค้นหาทั้งหมดจากฐานข้อมูลนี้จะทำได้โดยการใช้วิธีการดำเนินการ
  • ข่าวจับคำสั่งนี้จะทำได้โดยการใช้วิธีการเสร็จสิ้น
  • หากทุกอย่างไปแล้วการดำเนินการกระทำหรือคุณสามารถดำเนินการย้อนกลับการทำธุรกรรม
#!/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

ดำเนินการลบ

เมื่อคุณต้องการลบระเบียนจากฐานข้อมูลที่คุณจำเป็นต้องใช้การดำเนินการลบ ตัวอย่างต่อไปนี้ลบอายุ 20 กว่าระเบียนทั้งหมดจากพนักงาน ขั้นตอนการดำเนินการดังต่อไปนี้:

  • ตามเงื่อนไขที่จำเป็นสำหรับการเตรียมความพร้อมของคำสั่งของ SQLนี้จะทำได้โดยการใช้วิธีการเตรียมความพร้อม
  • ดำเนินการแบบสอบถาม SQL ลบระเบียนที่ต้องการจากฐานข้อมูลนี้จะทำได้โดยการใช้วิธีการดำเนินการ
  • ข่าวจับคำสั่งนี้จะทำได้โดยการใช้วิธีการเสร็จสิ้น
  • หากทุกอย่างไปแล้วการดำเนินการกระทำหรือคุณสามารถดำเนินการย้อนกลับการทำธุรกรรม
#!/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

ฝ่ายบริหาร

ธุรกรรมเป็นกลไกในการตรวจสอบความสอดคล้องการทำธุรกรรม บริการต่อไปนี้ควรจะมีคุณลักษณะที่สี่:

  • อะตอมมิกซิตี้ (อะตอมมิกซิตี้): atomicity ของการทำธุรกรรมหมายความว่าโปรแกรมจะรวมอยู่ในการทำธุรกรรมเป็นหน่วยตรรกะของฐานข้อมูลการทำงานก็ไม่การดำเนินการแก้ไขข้อมูลทั้งทั้งหมดดำเนินการหรือไม่ดำเนินการทั้งหมด
  • ความสอดคล้อง (Consistency): การทำธุรกรรมสอดคล้องหมายถึงการทำธุรกรรมดำเนินการก่อนและหลังการดำเนินงานของฐานข้อมูลจะต้องอยู่ในสถานะที่สอดคล้องกันถ้ารัฐของฐานข้อมูลตอบสนองความ จำกัด ของความสมบูรณ์ทั้งหมดกล่าวว่าฐานข้อมูลไม่สอดคล้อง
  • การแยก (แยก): แยกรายการหมายถึงการทำธุรกรรมที่เกิดขึ้นพร้อมกันจะแยกจากกัน, ที่อยู่, ที่อยู่ในการทำธุรกรรมของการดำเนินงานและการดำเนินงานข้อมูลจะถูกปิดผนึกมันจะไม่เห็นความพยายามในการอื่น ๆ ในการปรับเปลี่ยนการทำธุรกรรม
  • ถาวร (Durability): ความคงทนการทำธุรกรรมหมายความว่าการทำธุรกรรมเมื่อระบบหรือสื่อความล้มเหลวความมุ่งมั่นเพื่อให้มั่นใจว่าการปรับปรุงไม่สามารถสูญหายว่าเมื่อทำธุรกรรมที่กระทำการเปลี่ยนแปลงข้อมูลในฐานข้อมูลควรจะถาวรทนใด ๆ ล้มเหลวของระบบฐานข้อมูล รับประกันถาวรโดยการสำรองฐานข้อมูลและการกู้คืน

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

COMMIT การดำเนินงาน

กระทำจะดำเนินการเสร็จเรียบร้อยแล้วเพื่อแจ้งการเปลี่ยนแปลงฐานข้อมูลและหลังจากการดำเนินการนี้การเปลี่ยนแปลงทั้งหมดที่ไม่ได้รับคืน

นี่คือตัวอย่างง่ายๆกระทำวิธีการอุทธรณ์

     dbh.commit

ดำเนินการย้อนกลับ

ถ้าคุณไม่พอใจกับหนึ่งหรือเปลี่ยนแปลงบางอย่างที่คุณต้องการที่จะสมบูรณ์เรียกคืนการเปลี่ยนแปลงเหล่านี้ใช้วิธีการย้อนกลับ

นี่คือตัวอย่างง่ายๆของการเรียกวิธีการย้อนกลับ

     dbh.rollback

ยกเลิกการเชื่อมต่อฐานข้อมูล

ยกเลิกการเชื่อมต่อฐานข้อมูลใช้ตัดการเชื่อมต่อของ API

    dbh.disconnect

หากผู้ใช้ปิดการเชื่อมต่อฐานข้อมูลวิธีการตัดการเชื่อมต่อ, DBI ย้อนกลับการทำธุรกรรมทั้งหมดที่ไม่สมบูรณ์ แต่มันไม่ได้ขึ้นอยู่กับรายละเอียดการดำเนินงานของ DBI ใด ๆ และการประยุกต์ใช้ของคุณสามารถโทรอย่างชัดเจนที่ดีที่จะกระทำหรือย้อนกลับ

ข้อผิดพลาดในการประมวลผล

มีแหล่งที่มาที่แตกต่างของข้อผิดพลาดอยู่ ยกตัวอย่างเช่นข้อผิดพลาดทางไวยากรณ์ในการดำเนินการของคำสั่ง SQL หรือการเชื่อมต่อล้มเหลวหรือเป็นคำสั่งที่สมบูรณ์หรือยกเลิกการโทรมือจับดึงข้อมูลวิธีการ

หากวิธีการ DBI ล้มเหลว DBI จะโยนข้อยกเว้น วิธี DBI สามารถโยนประเภทของข้อยกเว้นใด ๆ แต่ทั้งสองระดับข้อยกเว้นที่สำคัญที่สุดคือDBI :: InterfaceErrorและDBI :: DatabaseError

วัตถุข้อยกเว้นของการเรียนเหล่านี้มีความผิดพลาด,errstrสามคุณลักษณะและรัฐย่อยตารางหมายถึงจำนวนข้อผิดพลาดสตริงข้อผิดพลาดพรรณนาและรหัสข้อผิดพลาดมาตรฐานแอตทริบิวต์ที่ระบุดังนี้

  • ผิดพลาด: ส่งกลับข้อผิดพลาดที่เกิดขึ้นเป็นจำนวนเต็มโน้ตถ้า DBDไม่สนับสนุนการกลับมาของศูนย์ยกตัวอย่างเช่นออราเคิล DBD ส่งกลับส่วนข้อผิดพลาด ORA-XXXX
  • errstr: คืนเป็นตัวแทนสตริงของข้อผิดพลาดที่เกิดขึ้น
  • รัฐ: คืนรหัสข้อผิดพลาดที่เกิดขึ้น SQLSTATESQLSTATE เป็นความยาวสายห้าตัว ส่วนใหญ่ของ DBD ไม่สนับสนุนมันก็จะกลับศูนย์

ในตัวอย่างข้างต้นที่คุณเคยเห็นรหัสต่อไปนี้:

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"
..............

trace(mode, destination)

โหมดค่าเป็น 0 (off), 1,2 หรือ 3 ค่าของปลายทางที่ควรจะเป็นวัตถุ IO ค่าเริ่มต้นคือ 2 และ STDERR

วิธีการบล็อก

มีวิธีในการสร้างการจัดการที่มี วิธีการเหล่านี้จะถูกเรียกโดยการป้องกันรหัส ข้อดีของการใช้บล็อกรหัสกับวิธีการที่พวกเขาให้จับบล็อกเป็นอาร์กิวเมนต์เมื่อบล็อกถูกยกเลิกจับล้างโดยอัตโนมัติ นี่คือตัวอย่างบางส่วนที่จะช่วยให้เข้าใจแนวคิดนี้

  • DBI.connect:วิธีการนี้สร้างจัดการฐานข้อมูลก็จะแนะนำในตอนท้ายของบล็อกตัดการเชื่อมต่อการเรียกร้องให้ยกเลิกการเชื่อมต่อฐานข้อมูล
  • dbh.prepare: วิธีการนี้จะสร้างคำสั่งจับแนะนำโทรเสร็จในตอนท้ายของบล็อกภายในบล็อกคุณต้องเรียกวิธีการดำเนินการที่จะดำเนินการคำสั่ง
  • dbh.execute: วิธีการนี้จะคล้ายกับ dbh.prepare แต่ dbh.execute ไม่จำเป็นต้องโทรดำเนินการวิธีการที่อยู่ในบล็อกจับคำสั่งจะถูกดำเนินการโดยอัตโนมัติ

ตัวอย่างที่ 1

DBI.connect อาจจะมีบล็อกของรหัสผ่านมันจัดการฐานข้อมูลและการจัดการโดยอัตโนมัติจะตัดการเชื่อมต่อในตอนท้ายของบล็อก

dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
                  "testuser", "test123") do |dbh|

ตัวอย่างที่ 2

dbh.prepare อาจจะมีการป้องกันรหัสผ่านคำสั่งจับและจะเรียกร้องให้จบในตอนท้ายของบล็อก

dbh.prepare("SHOW DATABASES") do |sth|
       sth.execute
       puts "Databases: " + sth.fetch_all.join(", ")
end

ตัวอย่างที่ 3

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)
สร้างฐานข้อมูลใหม่
2 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
ส่งกลับ 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