標籤:python
ORM介紹
orm英文全稱object relational mapping,就是對象映射關係程式,簡單來說我們類似python這種物件導向的程式來說一切皆對象,但是我們使用的資料庫卻都是關係型的,為了保證一致的使用習慣,通過orm將程式設計語言的物件模型和資料庫的關聯式模式建立映射關係,這樣我們在使用程式設計語言對資料庫進行操作的時候可以直接使用程式設計語言的物件模型進行操作就可以了,而不用直接使用sql語言。
orm的優點:
隱藏了資料訪問細節,“封閉”的通用資料庫互動,ORM的核心。他使得我們的通用資料庫互動變得簡單易行,並且完全不用考慮該死的SQL語句。快速開發,由此而來。
ORM使我們構造固化資料結構變得簡單易行。
缺點:
無可避免的,自動化意味著映射和關聯管理,代價是犧牲效能(早期,這是所有不喜歡ORM人的共同點)。現在的各種ORM架構都在嘗試使用各種方法來減輕這塊(LazyLoad,Cache),效果還是很顯著的。
sqlalchemy安裝
pip install SQLAlchemy
pip install pymysql
sqlalchemy基本使用
先建立一個表
CREATE TABLE user ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(32), password VARCHAR(64), PRIMARY KEY (id))
使用sqlalchemy實現同樣的功能
建立user表
import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringengine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python", encoding="utf-8", echo=True)Base = declarative_base() # 產生orm基類class User(Base): __tablename__ = "user" # 表明 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64))Base.metadata.create_all(engine) # 建立表結構
user表已經建立好了,那我們開始用orm建立一條資料試試
import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.orm import sessionmaker# 建立user表engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python", encoding="utf-8")Base = declarative_base() # 產生orm基類class User(Base): __tablename__ = "user" # 表名 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64))Base.metadata.create_all(engine) # 建立表結構Session_class = sessionmaker(bind=engine) # 建立與資料庫的會話session class,注意,這裡返回給session的是個class,不是執行個體Session = Session_class() # 產生session執行個體user_obj = User(name="Rain", password="1111111") # 產生你要建立的資料對象# print(user_obj.name, user_obj.password) # 此時還沒建立對象呢,不信你列印一下id發現還是NoneSession.add(user_obj) # 把要建立的資料對象添加到這個session裡,一會統一建立# print(user_obj.name, user_obj.id) # 此時也依然還沒建立Session.commit() # 現在才統一提交,建立資料
查詢
import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.orm import sessionmakerengine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python", encoding="utf-8") Base = declarative_base()class User(Base): __tablename__ = "user" # 表明 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)data = Session.query(User).filter(User.name=="Tom").all() # 查詢user表中name為Tom的,所有資訊data = Session.query(User).filter_by(name="Tom").all() # 查詢user表中name為Tom的,所有資訊data = Session.query(User.name).filter(User.id > 3).all() # 查詢user表中id大於3的,namedata = Session.query(User).filter(User.id > 0).filter(User.id < 3).all() # 多條件查詢data = Session.query(User).filter(User.id > 0).filter(User.name == "Tom").all()print(data)
修改資料
import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.orm import sessionmaker# # 建立user表engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python", encoding="utf-8")Base = declarative_base() # 產生orm基類class User(Base): __tablename__ = "user" # 表明 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)Session_class = sessionmaker(bind=engine) # 建立與資料庫的會話session class,注意,這裡返回給session的是個class,不是執行個體Session = Session_class() # 產生session執行個體data = Session.query(User).filter_by(name="Tom").first()data.name = "Ben"Session.commit()
刪除資料
import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.orm import sessionmaker# 建立user表engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python", encoding="utf-8")Base = declarative_base() # 產生orm基類class User(Base): __tablename__ = "user" # 表明 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)Session_class = sessionmaker(bind=engine) # 建立與資料庫的會話session class,注意,這裡返回給session的是個class,不是執行個體Session = Session_class() # 產生session執行個體data = Session.query(User).filter_by(name="Ben").first()Session.delete(data)Session.commit()
統計
import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.orm import sessionmaker# 建立user表engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python", encoding="utf-8")Base = declarative_base() # 產生orm基類class User(Base): __tablename__ = "user" # 表明 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)Session_class = sessionmaker(bind=engine) # 建立與資料庫的會話session class,注意,這裡返回給session的是個class,不是執行個體Session = Session_class() # 產生session執行個體data = Session.query(User).filter(User.name.like("Ra%")).count()print(data)
分組
import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.orm import sessionmakerfrom sqlalchemy import func# 建立user表engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python", encoding="utf-8")Base = declarative_base() # 產生orm基類class User(Base): __tablename__ = "user" # 表明 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)Session_class = sessionmaker(bind=engine) # 建立與資料庫的會話session class,注意,這裡返回給session的是個class,不是執行個體Session = Session_class() # 產生session執行個體data = Session.query(func.count(User.name), User.name).group_by(User.name).all()print(data)
本文出自 “八英裡” 部落格,請務必保留此出處http://5921271.blog.51cto.com/5911271/1913920
Python之路51-sqlalchemy