Sequel חלק ראשון

הקדמה

נכתבו עבור עבודה בשפת רובי מספר ספריות ORM. הספרייה המוכרת ביותר (ובעיני הבעייתית ביותר) היא ActiveRecord המגיעה כחלק מ Rails, אך עומדת גם בינה לבין עצמה.
ספריית ORM אחרת שאני מחבב בערך מהניסוי השני שלי (בניסוי הראשון לא הבנתי אותה), נקראת Sequel.

היא עובדת מצד אחד בגישה שונה מActiveRecord, כך שלהגר אליה אינו דבר של מה בכך, אך לאחר שמבינים אותה, מגלים ספרייה עם יותר כוח, אבל בעיקר שכתובה ועובדת נכון יותר (לדעתי).
ביולי הספרייה הגיעה לגרסה 4.0.0, והחלטתי שהגיע הזמן גם לדבר עליה, כאשר בחלק השני, אצור גם דוגמאות חזקות יותר, ואפילו כיצד יוצרים סוג של migration איתה כדוגמת צורת העבודה הנהוגה ב Rails.

על הספרייה

הספרייה מחולקת לשני חלקים:

  1. חלק ראשון הוא ה core, אשר עובד בצורה זהה, וזקוק מאחורי הקלעים לחיבור מסדי נתונים.
  2. החלק השני הוא חלק התוספים, אשר מסוגלים להוסיף לספרייה יכולות נוספות, אך צריך לאפשר אותם. לצערי עדיין לא התעסקתי עם חלק התוספים, ולכן נכון לפוסט זה, עדיין לא אוכל לכתוב עליהם דבר מה.

התקנה

על מנת להתקין את sequel, דבר ראשון נתקין אותו, ודבר שני את הדריבר הרגיל לחיבור מסד הנתונים:

$ gem install sqlite3 sequel

התחלה


על מנת ליצור חיבור לספרייה, אנחנו צריכים להחליט באיזה מסד נתונים אנחנו רוצים לעבוד. להדגמה כאן אשתמש ב Sqlite.

החיבור הראשוני יראה כך (חשוב להבין שמסד הנתונים יושב מקומית בספרייה שאנחנו נמצאים בה):

require 'rubygems'
require 'sequel'

DB = Sequel.connect('sqlite://blog.db')

דרך נוספת להתחבר ל Sqlite תהיה כך:

DB = Sequel.sqlite('blog.db')

ניתן גם להגדיר אותו לעבוד עם SQLite בזיכרון:

DB = Sequel.sqlite(:memory)

עד לכאן, זה רוב השוני בין סוגי החיבורים השונים, והתאמת החיבור נקודית למסד נתונים.
מכאן, הכל נהיה גנרי יותר.

היות ועדיין לא יצרנו כלום במסד הנתונים, רק אמרנו לו שיש כזה, נוכל ליצור טבלה, נגיד posts:

DB.create_table :posts do
   primary_key :id
   column :title, :text
   String :content
   index :title
end

כפי שניתן לראות, התחביר די מדבר בעד עצמו, ולא משתנה בין מסד נתונים אחד למישנהו, אבל כן מתורגם לשפה שהוא מבין. כיאה ל ORM טוב.
אם ניגש ונכתוב בשורת הפקודה עכשיו sqlite3 blog.db, נוכל לראות מספר דברים:
1. יש טבלה בשם posts:

sqlite> .tables
posts
sqlite>

2. את מבנה הטבלה:

sqlite> .schema posts
CREATE TABLE `posts` (`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, `title` text, `content` varchar(255));
CREATE INDEX `posts_title_index` ON `posts` (`title`);
sqlite>

וכך אנחנו יודעים שה ORM עשה את העבודה כמו שצריך.
השלב הבא יהיה להזין רשומה חדשה.
דבר ראשון, איצא את הטבלה למשתנה חיצוני:

posts = DB[:posts]

כאן יצרנו ריצה על הטבלה, ושמנו "מצביע" אליה ל posts. למעשה באמצעות DB אפשר לעשות את כל הפעולות על כל טבלה, אבל אני מעדיף להאציל סמכויות.
עכשיו אזין רשומה ראשונה:

posts.insert(title: 'My first post', content: 'This is my first post')

במידה והדריבר/מסד הנתונים תומך, posts יחזיר לנו את הid של הרשומה שהזנו. במידה ויש בעיה, תעלה חריגה לאוויר.

עכשיו נרצה לשלוף את כל המידע שלנו ממסד הנתונים:

posts.all
=> [{:id=>1, :title=>"My first post", :content=>"This is my first post"}]

במידה ונרצה רק את הרשומה הראשונה, נבצע זאת כך:

posts.first
=> {:id=>1, :title=>"My first post", :content=>"This is my first post"}

במידה ואנחנו רוצים לחפש משהו, ולהחזיר את כל מה שקיים, חשוב לשרשר פעולות, כאשר שרשור החיפוש חייב להגיע ראשון עבור יעילות הריצה:

posts.where(id: 2).all
=> []

עד כאן לחלק הבסיסי והפשוט כל כך. בחלק הבא אתחיל לסבך את העניינים באמת.

2 מחשבות על “Sequel חלק ראשון

  1. פינגבק: Sequel חלק שני | לראות שונה

  2. פינגבק: Sequel וPostgreSQL | לראות שונה

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s