การเข้าถึงฐานข้อมูลทับทิม - 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 สถาปัตยกรรมทั่วไปใช้สองชั้น:
- ฐานข้อมูล 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