天天看點

python裡用ORM——SQLAlchemy操作mysql資料庫orm使用

ORM介紹

orm全稱object relational mapping,就是對象映射關系程式。

簡單來說,對于面向對象的語言來說一切皆對象,但是我們使用的資料庫卻都是關系型的。

為了保證一緻的使用習慣,通過orm将程式設計語言的對象模型和資料庫的關系模型建立映射關系,

這樣我們在使用程式設計語言對資料庫進行操作的時候可以直接使用類似面向對象的操作進行,而不用直接使用sql語言。

也就是對sql功能的封裝,在以後使用時,通過對象.方法來進行增删改查。

orm的優點:

  1. 隐藏了資料通路細節,“封閉”的通用資料庫互動,ORM的核心。他使得我們的通用資料庫互動變得簡單易行,并且完全不用考慮SQL語句。快速開發,由此而來。
  2. ORM使我們構造固化資料結構變得簡單易行。

缺點:

  1. 無可避免的,自動化意味着映射和關聯管理,代價是犧牲性能(早期,這是所有不喜歡ORM人的共同點)。現在的各種ORM架構都在嘗試使用各種方法來減輕這塊(LazyLoad,Cache),效果還是很顯著的。

orm使用

在Python中,最有名的ORM架構是SQLAlchemy。

1、連接配接資料庫

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

#建立連接配接
'''什麼資料庫+資料庫的包://使用者名:密碼@主機/資料庫名稱(db)'''
engine = create_engine("mysql+pymysql://root:[email protected]/us_states",
                       encoding='utf-8', echo=False) #echo表示是否列印所有操作資訊
           

2、建立表格和插入資料

Base = declarative_base()  # 生成orm基類

#表的類,表的結構,要先用類的形式寫好這個表格
class User(Base):   #繼承基類
    __tablename__ = 'user'  # 表名
    #下面3個是列
    id = Column(Integer, primary_key=True)  #column是列,id是主鍵
    name = Column(String(32))
    password = Column(String(64))


'''建立表格'''
Base.metadata.create_all(engine)


'''生成執行個體'''
Session_class = sessionmaker(bind=engine)  #傳回的是類,建立與資料庫的會話session類 ,這裡傳回給session的是個class,不是執行個體
Session = Session_class()  #這裡再執行個體化,生成session執行個體,這個session就和pymysql裡的cursor一樣

'''插入資料'''
#這裡就是面向對象的形式建立每一行的資料了
user_obj = User(name="lkk", password="lkk111")  # 生成你要建立的資料對象1
user_obj2 = User(name="lihua", password="lihua111")  # 生成你要建立的資料對象2
print(user_obj.name, user_obj.id)  # 此時還沒建立對象,列印一下id發現還是None

Session.add(user_obj)  # 把要建立的資料對象添加到這個session裡, 一會統一建立
Session.add(user_obj2)

print(user_obj.name, user_obj.id)  # 此時也依然還沒建立

Session.commit()  # 現此才統一送出,建立(插入)資料,凡對資料進行了改動就要送出

           

3、查詢資料

'''查資料'''
data = Session.query(User).filter_by().all()    #取全部出來
data = Session.query(User).filter_by().first()  #取第一行
data = Session.query(User).filter(User.id > 2).all()  #取id>2的
data = Session.query(User).filter(User.id > 2).filter(User.id < 4).all()  #取4>id>2的
data = Session.query(User).filter(User.id == 2).all()  #取id=2的
print(data)
           

4、修改資料

'''修改資料'''
data = Session.query(User).filter(User.id == 2).all()  #取到id=2的
#單改一個屬性
data.name = 'lkk1'  #現在可以改名字了
           

5、復原

my_user = Session.query(User).filter_by(id=1).first()
my_user.name = "Jack"

fake_user = User(name='Rain', password='12345')
Session.add(fake_user)

print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all())  # 這時看session裡有你剛添加和修改的資料

Session.rollback()  # 此時rollback一下

print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all())  # 再查就發現剛才添加的資料沒有了。
           

6、統計和分組

'''統計和分組'''
from sqlalchemy import func
print(Session.query(User).filter(User.name.like("lk%")).count())    #查找表格中lk開頭的人出現多少次
print(Session.query(User.name, func.count(User.name)).group_by(User.name).all() )   #統計每個name出現多少次
           

7、統計和分組

'''删除'''
Session.query(User).filter(User.id > 2).delete()
Session.commit()
           

8、連結清單查詢

'''連表查詢'''
ret = Session.query(User, Favor).filter(User.id == Favor.id).all()

ret = Session.query(Person).join(Favor).all()

ret = Session.query(Person).join(Favor, isouter=True).all()