8.1 מסד נתונים הרצאה
הקדמה - מסד נתונים - Database¶
- מסד נתונים או באנגלית database או בקיצור DB זה תוכנה שמטרתה לשמור מידע.
- מסדי נתונים שומרים מידע בצורה יעילה, מאפשרים שליפה של המידע ומניפולציה על המידע
- חשבו על כל הפעמים שהשתמשתם בקבצים כדי לשמור נתונים, זה לא היה הכי נוח, ולא הכי יעיל - לשם זה מסדי נתונים קיימים.
שפת שליפה - Query language¶
- המון פעמים נרצה לכתוב תכנות שיודעות לדבר עם DB-ים.
למשל: תוכנה ששומרת מידע בDB, שולפת מידע, מכניסה מידע, או מוחקת מידע. - תוכנות מתקשרות עם DB-ים באמצעות "שפת שליפה" או באנגלית query languege
- שפת שליפה היא שפה שמטרתה לעזור לנו לעשות שליפות על הDB ועוד.
- שפות שליפה פופלוריות הן למשל: SQL, NoSQL, GraphQL
סוגים שונים של מסדי נתונים¶
- מסד נתונים רלציוני (טבלאי): מסד נתונים מסוג זה שומר את המידע בטבלאות, כדי לשלוף על מסדים מהסוג הזה נשתמש בשפת שליפה SQL, דוגמה של מסדי נתונים רלציונים: MySQL, PostgreSQL, SQLite
- מסד נתונים א-רלציוני (לא טבלאי): מסד נתונים מסוג זה שומר מידע שלא נשמר טוב בטבלאות, יכול להיות מידע שנשמר כמו מילון, ג'סונים, ועוד. כדי לשלוף על מסדים מהסוג הזה נשתמש בשפת שליפה NoSQL, דוגמה של מסדי נתונים א-רלציונים: MongoDB, Cassandra.
- מסדי נתונים מובני עצמים (אובייקטים): מסד נתונים ששומר מידע בצורה של אובייקט, דומה למסדים א-רלציונים, יש המון סוגים שונים של מסדים כאלה.
איך לבחור מסד נתונים לפרויקט שלך?¶
- איזה סוג מידע אנחנו שומרים בפרויקט? מידע טבלאי או מידע לא טבלאי (מידע שבא יותר בצורת JSON)
- כמה מידע אנחנו צריכים לשמור? איזה מסדי נתונים יכולים לשמור כמות כזו של מידע?
- איזה סוגים של שליפות / מניפולציות אנחנו נרצה לעשות על המידע? איזה מסדי נתונים תומכים בזה?
שפת שליפה SQL¶
- בהרצאה הזו נלמד על שליפות עם SQL ואיך להשתמש בSQL בפייתון עם הDB שנקרא SQLITE
- זכרו - SQL זה בשביל DB-ים רלציונים, ממליץ מאוד בפרויקטים שלכם לבחור DB ושפת שליפות, ממליץ לנסות גם בעצמכם לנסות להשתמש בDB א-רלציוני כמו mongoDB עם שפת NoSQL
יצירת טבלה חדשה עם SQL¶
- כדי לשמור מידע בDB אנחנו נצטרך לצור טבלה, הנה שאילת SQL שיוצרת טבלה
- הולך ליצור טבלה חדשה, עם 3 שדות.
- מפתח id - זהו מזהה מיוחד לכל משתמש בטבלה (מספר שלם) (מפתח ראשי)
- שם משתמש - שם המשתמש (טקסט)
- סיסמה - הסיסמה של המשתמש (טקסט)
| id | username | password |
|---|---|---|
הכנסת מידע לטבלה¶
- הוספנו ערך חדש לטבלה
users עם הערכים שם username=Amit ו - password=Password1, הid (המפתח הראשי) מתווסף אוטומטית
שליפת מידע מהDB¶
- זה ישלוף את כל השמות משתמשים, והסיסמאות מהטבלה
users
| username | password |
|---|---|
| Amit | Password1 |
| Shir | 123456 |
| Ben | iloveyou |
- זה ישלוף את כל השמות משתמשים, והסיסמאות מהטבלה
users כאשר השם משתמש שלהם הוא "Amit" (תנאים)
| username | password |
|---|---|
| Amit | Password1 |
- שליפה של שדה ספציפי - במקרה זה password
| password |
|---|
| Password1 |
- שליפה על כל הערכים בDB
| id | username | password |
|---|---|---|
| 1 | Amit | Password1 |
| 2 | Shir | 123456 |
| 3 | Ben | iloveyou |
מחקית מידע מהDB¶
- כדי למחוק מידע נכתוב שאילתת שליפה רגילה כמו מקודם, רק שבמקום SELECT נכתוב DELETE
הדגמה - SQLite DB¶
- כדי להדגים SQL ומסד נתונים פשוט שניתן להפעיל בקלות נבחר במסד נתונים SQLite
-
המסד SQLite הוא מסד נתונים פשוט וקל מאוד, היתרון שלו שהוא פשוט ואפשר להרים אותו מאוד בקלות, כל הנתונים של המסד נשמרים בקובץ אחד.
-
קוד פייתון שמשתמש בשאילתות כדי לתקשר עם הdatabase
import sqlite3 conn = sqlite3.connect('example.db') # Connect to the SQLite database (or create it if it doesn't exist) cursor = conn.cursor() # Create a cursor object to execute SQL queries cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''') # Create a table cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30)) # Insert data into the table cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25)) conn.commit() # Commit changes cursor.execute("SELECT * FROM users") # Query the database for row in cursor.fetchall(): print(row) conn.close() # Close the connection - נסו להריץ את הקוד הזה בעצמכם, עברו עליו והבינו מה כל שורה עושה.
דרכים להתממשק מול DB¶
- כמו שראינו אפשר להשתמש במחרוזת SQL כדי להתממשק מול DB, למעשה זה דרך לא טובה לעשות זאת זה, ויש לה מספר חסרונות:
- היא דרך לא יפה, כי אנחנו צריכים ממש לכתוב את השליפות בקוד שלנו.
- היא פחות מאובטחת, נלמד בעתיד על דרכים שבהם אפשר לנצל תוכנות של אנשים שכותבים שליפות בצורה כזו בקוד שלהם. (לא תאמינו כמה זה נפוץ)
- דרך טובה יותר זה באמצעות ORM - זה מאפשר לנו לגשת לDB בצורה אבסטרקטית ופשוטה יותר.
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# Define the SQLAlchemy engine
engine = create_engine('sqlite:///example.db', echo=True)
# Define a base class for our ORM models
Base = declarative_base()
# Define a class representing the 'users' table
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# Create the table in the database
Base.metadata.create_all(engine)
# Create a sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
# Insert data into the 'users' table using ORM
session.add_all([
User(name='Alice', age=30),
User(name='Bob', age=25)
])
session.commit()
# Query the database using ORM
users = session.query(User).all()
for user in users:
print((user.id, user.name, user.age))
# Close the session
session.close()