不懂Python ORM操作MySQL和SQLite?別怕,跟我學(xué)吧!
數(shù)據(jù)庫基礎(chǔ)概念
數(shù)據(jù)庫是一種用于存儲和管理數(shù)據(jù)的軟件系統(tǒng),它可以存儲和管理結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)等。數(shù)據(jù)庫中的數(shù)據(jù)通常以表格的形式組織,每個表格包含多個列和多個行。表格中的列定義了數(shù)據(jù)的類型和屬性,行表示實際的數(shù)據(jù)記錄。
SQL(Structured Query Language)是一種用于訪問和管理數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,它支持?jǐn)?shù)據(jù)的查詢、插入、更新和刪除等操作。SQL語言可以分為數(shù)據(jù)定義語言(DDL)、數(shù)據(jù)操作語言(DML)、數(shù)據(jù)控制語言(DCL)和數(shù)據(jù)查詢語言(DQL)等。
在Python中,我們可以使用各種庫和框架來操作和管理數(shù)據(jù)庫,例如使用MySQL、SQLite等關(guān)系型數(shù)據(jù)庫,使用MongoDB等非關(guān)系型數(shù)據(jù)庫,使用SQLAlchemy等ORM框架。
MySQL
MySQL是一種流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它支持多種操作系統(tǒng)和編程語言,并且具有高性能、可靠性和擴(kuò)展性等優(yōu)點。
在Python中,我們可以使用mysql-connector-python或pymysql等庫來連接和操作MySQL數(shù)據(jù)庫。
安裝MySQL
在使用MySQL之前,我們需要先安裝和配置MySQL。
在Linux系統(tǒng)中,可以使用以下命令來安裝MySQL:
sudo apt-get install mysql-server
在Windows系統(tǒng)中,可以從MySQL官網(wǎng)下載安裝程序進(jìn)行安裝。
安裝完成后,我們需要創(chuàng)建一個MySQL用戶,并為該用戶授權(quán)訪問數(shù)據(jù)庫??梢允褂靡韵旅顏韯?chuàng)建用戶和授權(quán):
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost';
在上面的命令中,'username'和'password'分別表示要創(chuàng)建的MySQL用戶的用戶名和密碼。
連接MySQL
在Python中,可以使用mysql-connector-python或pymysql等庫來連接MySQL數(shù)據(jù)庫。
以下是一個使用mysql-connector-python連接MySQL數(shù)據(jù)庫的示例:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="username",
password="password"
)
print(mydb)
在上面的示例中,我們創(chuàng)建了一個名為mydb的MySQL連接,并打印了該連接對象。
創(chuàng)建數(shù)據(jù)庫和表格
在MySQL中,可以使用CREATE DATABASE語句來創(chuàng)建數(shù)據(jù)庫,使用CREATE TABLE語句來創(chuàng)建表格。
以下是一個使用mysql-connector-python創(chuàng)建數(shù)據(jù)庫和表格的示例:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="username",
password="password"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE DATABASE mydatabase")
mycursor.execute("USE mydatabase")
mycursor.execute("CREATE TABLE customers (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), address VARCHAR(255))")
在上面的示例中,我們首先創(chuàng)建了一個名為mydatabase的數(shù)據(jù)庫,然后使用USE語句選擇該數(shù)據(jù)庫。接著,我們創(chuàng)建了一個名為customers的表格,其中包含三個列:id、name和address。
插入數(shù)據(jù)
在MySQL中,可以使用INSERT INTO語句向表格中插入數(shù)據(jù)。
以下是一個使用mysql-connector-python向表格中插入數(shù)據(jù)的示例:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="username",
password="password",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, "record inserted.")
在上面的示例中,我們向customers表格中插入了一條記錄,其中包含name和address兩個列的值。
查詢數(shù)據(jù)
在MySQL中,可以使用SELECT語句查詢表格中的數(shù)據(jù)。
以下是一個使用mysql-connector-python查詢數(shù)據(jù)的示例:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="username",
password="password",
database="mydatabase"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM customers")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
在上面的示例中,我們使用SELECT語句查詢customers表格中的所有數(shù)據(jù),并使用fetchall方法獲取查詢結(jié)果。最后,我們使用for循環(huán)遍歷查詢結(jié)果并打印。
更新數(shù)據(jù)
在MySQL中,可以使用UPDATE語句更新表格中的數(shù)據(jù)。
以下是一個使用mysql-connector-python更新數(shù)據(jù)的示例:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="username",
password="password",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "UPDATE customers SET address = 'Canyon 123' WHERE name = 'John'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, "record(s) affected")
在上面的示例中,我們使用UPDATE語句將customers表格中name為John的記錄的address列更新為Canyon 123。
刪除數(shù)據(jù)
在MySQL中,可以使用DELETE語句刪除表格中的數(shù)據(jù)。
以下是一個使用mysql-connector-python刪除數(shù)據(jù)的示例:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="username",
password="password",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "DELETE FROM customers WHERE name = 'John'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, "record(s) deleted")
在上面的示例中,我們使用DELETE語句刪除customers表格中name為John的記錄。
SQLite
SQLite是一種輕量級的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它不需要獨立的服務(wù)器進(jìn)程或系統(tǒng),數(shù)據(jù)存儲在本地文件中,適合于嵌入式設(shè)備和小型應(yīng)用程序等場景。
在Python中,我們可以使用sqlite3庫來連接和操作SQLite數(shù)據(jù)庫。
連接SQLite
以下是一個使用sqlite3連接SQLite數(shù)據(jù)庫的示例:
import sqlite3
conn = sqlite3.connect('example.db')
在上面的示例中,我們創(chuàng)建了一個名為example.db的SQLite連接。
創(chuàng)建表格
在SQLite中,可以使用CREATE TABLE語句創(chuàng)建表格。
以下是一個使用sqlite3創(chuàng)建表格的示例:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE stocks
(date text, trans text, symbol text, qty real, price real)''')
在上面的示例中,我們創(chuàng)建了一個名為stocks的表格,其中包含五個列:date、trans、symbol、qty和price。
插入數(shù)據(jù)
在SQLite中,可以使用INSERT INTO語句向表格中插入數(shù)據(jù)。
以下是一個使用sqlite3向表格中插入數(shù)據(jù)的示例:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.commit()
在上面的示例中,我們向stocks表格中插入了一條記錄,其中包含五個列的值。
查詢數(shù)據(jù)
在SQLite中,可以使用SELECT語句查詢表格中的數(shù)據(jù)。
以下是一個使用sqlite3查詢數(shù)據(jù)的示例:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
for row in c.execute('SELECT * FROM stocks ORDER BY price'):
print(row)
在上面的示例中,我們使用SELECT語句查詢stocks表格中的所有數(shù)據(jù),并按price列進(jìn)行排序。最后,我們使用for循環(huán)遍歷查詢結(jié)果并打印。
更新數(shù)據(jù)
在SQLite中,可以使用UPDATE語句更新表格中的數(shù)據(jù)。
以下是一個使用sqlite3更新數(shù)據(jù)的示例:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute("UPDATE stocks SET qty = 200 WHERE symbol = 'RHAT'")
conn.commit()
print("Number of rows updated: ", conn.total_changes)
在上面的示例中,我們使用UPDATE語句將stocks表格中symbol為RHAT的記錄的qty列更新為200。
刪除數(shù)據(jù)
在SQLite中,可以使用DELETE語句刪除表格中的數(shù)據(jù)。
以下是一個使用sqlite3刪除數(shù)據(jù)的示例:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute("DELETE FROM stocks WHERE symbol = 'RHAT'")
conn.commit()
print("Number of rows deleted: ", conn.total_changes)
在上面的示例中,我們使用DELETE語句刪除stocks表格中symbol為RHAT的記錄。
ORM框架
ORM(Object-Relational Mapping)框架是一種將對象模型和關(guān)系模型進(jìn)行映射的技術(shù),它可以將數(shù)據(jù)庫中的表格映射為Python中的類,將表格中的列映射為類的屬性,從而使得我們可以使用面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫。
在Python中,SQLAlchemy是一個流行的ORM框架,它支持多種關(guān)系型數(shù)據(jù)庫,包括MySQL、SQLite、PostgreSQL等。
安裝SQLAlchemy
在使用SQLAlchemy之前,我們需要先安裝SQLAlchemy。
可以使用以下命令來安裝SQLAlchemy:
pip install sqlalchemy
連接數(shù)據(jù)庫
在SQLAlchemy中,可以使用create_engine函數(shù)創(chuàng)建一個數(shù)據(jù)庫連接對象。
以下是一個使用SQLAlchemy連接MySQL數(shù)據(jù)庫的示例:
from sqlalchemy import create_engine
engine = create_engine("mysql+mysqlconnector://username:password@localhost/mydatabase")
在上面的示例中,我們創(chuàng)建了一個名為engine的MySQL連接對象。
以下是一個使用SQLAlchemy連接SQLite數(shù)據(jù)庫的示例:
from sqlalchemy import create_engine
engine = create_engine("sqlite:///example.db")
在上面的示例中,我們創(chuàng)建了一個名為engine的SQLite連接對象。
定義數(shù)據(jù)模型
在SQLAlchemy中,可以使用declarative_base函數(shù)定義一個基本的數(shù)據(jù)模型類,從而建立數(shù)據(jù)庫中表格和Python中類的映射關(guān)系。
以下是一個使用SQLAlchemy定義數(shù)據(jù)模型的示例:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class Customer(Base):
__tablename__ = 'customers'
id = Column(Integer, primary_key=True)
name = Column(String(255))
address = Column(String(255))
在上面的示例中,我們定義了一個名為Customer的數(shù)據(jù)模型類,表示數(shù)據(jù)庫中的customers表格。該類繼承自Base類,其中包含三個屬性:id、name和address。
創(chuàng)建表格
在SQLAlchemy中,可以使用Base類的metadata屬性和create_all方法來創(chuàng)建表格。
以下是一個使用SQLAlchemy創(chuàng)建表格的示例:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("mysql+mysqlconnector://username:password@localhost/mydatabase")
Session = sessionmaker(bind=engine)
from models import Base, Customer
Base.metadata.create_all(engine)
在上面的示例中,我們使用Base.metadata屬性和create_all方法創(chuàng)建了數(shù)據(jù)庫中的表格。其中,engine對象表示了連接到數(shù)據(jù)庫的引擎,Base類表示了數(shù)據(jù)模型類的基類,Customer類表示了要創(chuàng)建的數(shù)據(jù)模型類。
插入數(shù)據(jù)
在SQLAlchemy中,可以使用Session類和add方法向表格中插入數(shù)據(jù)。
以下是一個使用SQLAlchemy向表格中插入數(shù)據(jù)的示例:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("mysql+mysqlconnector://username:password@localhost/mydatabase")
Session = sessionmaker(bind=engine)
from models import Customer
session = Session()
customer1 = Customer(name='John', address='Highway 21')
customer2 = Customer(name='Bob', address='Main Street')
session.add(customer1)
session.add(customer2)
session.commit()
session.close()
在上面的示例中,我們使用Session類創(chuàng)建了一個名為session的會話對象,然后創(chuàng)建了兩個名為customer1和customer2的Customer對象,并使用add方法將它們添加到會話對象中。最后,我們使用commit方法提交會話,并關(guān)閉會話對象。
查詢數(shù)據(jù)
在SQLAlchemy中,可以使用Session類和query方法查詢表格中的數(shù)據(jù)。
以下是一個使用SQLAlchemy查詢數(shù)據(jù)的示例:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("mysql+mysqlconnector://username:password@localhost/mydatabase")
Session = sessionmaker(bind=engine)
from models import Customer
session = Session()
customers = session.query(Customer).all()
for customer in customers:
print(customer.name, customer.address)
session.close()
在上面的示例中,我們使用Session類創(chuàng)建了一個名為session的會話對象,然后使用query方法查詢了customers表格中的所有數(shù)據(jù),并使用all方法獲取查詢結(jié)果。最后,我們使用for循環(huán)遍歷查詢結(jié)果并打印。注意,在使用SQLAlchemy查詢數(shù)據(jù)時,我們并沒有直接使用SQL語句,而是使用了Python的面向?qū)ο蠓绞健?/p>
更新數(shù)據(jù)
在SQLAlchemy中,可以使用Session類和commit方法更新表格中的數(shù)據(jù)。
以下是一個使用SQLAlchemy更新數(shù)據(jù)的示例:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("mysql+mysqlconnector://username:password@localhost/mydatabase")
Session = sessionmaker(bind=engine)
from models import Customer
session = Session()
customer = session.query(Customer).filter_by(name='John').first()
customer.address = 'Highway 22'
session.commit()
session.close()
在上面的示例中,我們使用Session類創(chuàng)建了一個名為session的會話對象,然后使用query方法查詢了customers表格中name為John的數(shù)據(jù),并使用first方法獲取查詢結(jié)果的第一個元素。接著,我們將該元素的address屬性更新為'Highway 22',最后使用commit方法提交更新,并關(guān)閉會話對象。
刪除數(shù)據(jù)
在SQLAlchemy中,可以使用Session類和commit方法刪除表格中的數(shù)據(jù)。
以下是一個使用SQLAlchemy刪除數(shù)據(jù)的示例:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("mysql+mysqlconnector://username:password@localhost/mydatabase")
Session = sessionmaker(bind=engine)
from models import Customer
session = Session()
customer = session.query(Customer).filter_by(name='John').first()
session.delete(customer)
session.commit()
session.close()
在上面的示例中,我們使用Session類創(chuàng)建了一個名為session的會話對象,然后使用query方法查詢了customers表格中name為John的數(shù)據(jù),并使用first方法獲取查詢結(jié)果的第一個元素。接著,我們使用delete方法刪除該元素,并使用commit方法提交刪除,并關(guān)閉會話對象。
總之,SQLAlchemy是一個強大的ORM框架,它提供了豐富的功能,可以大大簡化Python和關(guān)系型數(shù)據(jù)庫之間的交互。