sqlalchemy簡介 SQLAlchemy是Python編程語言下的一款開源軟體。提供了SQL工具包及對象關係映射(ORM)工具,使用MIT許可證發行。 SQLAlchemy“採用簡單的Python語言,為高效和高性能的資料庫訪問設計,實現了完整的企業級持久模型”。SQLAlchemy的理念是, ...
sqlalchemy簡介
SQLAlchemy是Python編程語言下的一款開源軟體。提供了SQL工具包及對象關係映射(ORM)工具,使用MIT許可證發行。
SQLAlchemy“採用簡單的Python語言,為高效和高性能的資料庫訪問設計,實現了完整的企業級持久模型”。SQLAlchemy的理念是,SQL資料庫的量級和性能重要於對象集合;而對象集合的抽象又重要於表和行。因此,SQLAlchmey採用了類似於Java里Hibernate的數據映射模型,而不是其他ORM框架採用的Active Record模型。不過,Elixir和declarative等可選插件可以讓用戶使用聲明語法。
SQLAlchemy與資料庫關係圖如下:
sqlalchemy基本操作
一、安裝sqlalchemy
- 本文采用的是mysql案例,所以需要一臺有安裝mysql資料庫的機器
- 使用python的pip3安裝 pip3 install sqlalchemy
安裝完後查看版本信息
import sqlalchemy
sqlalchemy.__version__
二、連接資料庫
在sqlalchemy中,session用於創建程式與資料庫之間的會話。所有對象的載入和保存都需要通過session對象。
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 鏈接資料庫採用pymysq模塊做映射,後面參數是最大連接數5 ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5) Session = sessionmaker(bind=engine) session = Session()
三、創建映射(創建表)
一個映射對應著一個Python類,用來表示一個表的結構。下麵創建一個person表,包括id和name兩個欄位。也就是說創建表就是用python的的類來實現
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 ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5) #生成一個SQLORM基類,創建表必須繼承他,別問我啥意思就是這麼規定的 Base = declarative_base() class Person(Base): __tablename__ = 'userinfo' id = Column(Integer, primary_key=True) name = Column(String(32)) def __repr__(self): return "<Person(name='%s')>" % self.name
此代碼是創建了一個名字叫userinfo的表,表裡有兩列,一列是id,一列是name。
四、添加數據
當然我們創建了表,肯定也要添加數據,代碼如下:
#創建一個person對象 person = Person(name='張岩林') #添加person對象,但是仍然沒有提交到資料庫 session.add(person) #提交資料庫 session.commit()
當然還能添加多條數據:
session.add_all([ Person(name='張岩林'), Person(name='aylin') ]) session.commit()
五、查找數據
在sqlalchemy模塊中,查找數據給提供了query()的方法 下麵我就把能用到的給列舉一下:
#獲取所有數據 session.query(Person).all() #獲取name=‘張岩林’的那行數據 session.query(Person).filter(Person.name=='張岩林').one() #獲取返回數據的第一行 session.query(Person).first() #查找id大於1的所有數據 session.query(Person.name).filter(Person.id>1).all() #limit索引取出第一二行數據 session.query(Person).all()[1:3] #order by,按照id從大到小排列 session.query(Person).ordre_by(Person.id) #equal/like/in query = session.query(Person) query.filter(Person.id==1).all() query.filter(Person.id!=1).all() query.filter(Person.name.like('%ay%')).all() query.filter(Person.id.in_([1,2,3])).all() query.filter(~Person.id.in_([1,2,3])).all() query.filter(Person.name==None).all() #and or from sqlalchemy import and_ from sqlalchemy import or_ query.filter(and_(Person.id==1, Person.name=='張岩林')).all() query.filter(Person.id==1, Person.name=='張岩林').all() query.filter(Person.id==1).filter(Person.name=='張岩林').all() query.filter(or_(Person.id==1, Person.id==2)).all() # count計算個數 session.query(Person).count() # 修改update session.query(Person).filter(id > 2).update({'name' : '張岩林'})
查詢這塊比較多,可能寫的不全還望各位見諒,剩下我相信大家都能擴展起來
上面的介紹完了,可能各位還不能吧融合到一塊去,下麵我給大家融合寫在一塊吧:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column from sqlalchemy import Integer, String, TIMESTAMP from sqlalchemy import ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine ENGINE=create_engine("mysql+pymysql://[email protected]:3306/digchouti?charset=utf8", max_overflow=5) Base = declarative_base() class Person(Base): __tablename__ = 'userinfo' id = Column(Integer, primary_key=True) name = Column(String(32)) def __repr__(self): return "<Person(name='%s')>" % self.name #創建連接資料庫以供提交用,至此表會創建完成,可以去資料庫裡面查看 Base.metadata.create_all(ENGINE) Session = sessionmaker(bind=engine) # 往裡面插入多條數據 session = Session() session.add_all([ Person(name='張岩林'), Person(name='很帥') ]) session.commit()
sqlalchemy表關係之高級用法
上面闡述的是對於一張表的操作,下麵將說的是表關係的一對多,多對多,瞭解資料庫的都知道外鍵,也就是表關係建立。
1、一對多外鍵(1)
第一種方法我們只用到普通的操作,這個方式相對於好理解,在第一張表創建完,插入數據然後要記得提交數據,然後往第二章表創建數據的時候,可以直接拿第一張相關聯的數據,代碼如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String from sqlalchemy.orm import sessionmaker,relationship from sqlalchemy import create_engine engine=create_engine('mysql+pymysql://[email protected]:3306/db1') Base = declarative_base() class Son(Base): __tablename__ = 'son' id = Column(Integer,primary_key=True) name = Column(String(32)) age = Column(String(32)) # 創建外鍵,對應父親那張表的id項 father_id = Column(Integer,ForeignKey('father.id')) class Father(Base): __tablename__ = 'father' id = Column(Integer,primary_key=True) name = Column(String(32)) age = Column(String(32)) Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() f1 = Father(name = 'zhangyanlin',age = '18') session.add(f1) session.commit() w1 = Son(name = 'xiaozhang1',age = 3,father_id = 1) w2 = Son(name = 'xiaozhang2',age = 3,father_id = 1) session.add_all([w1,w2]) session.commit()
2、一對多外鍵(2)relationship
第二種方法和第一種一樣,只是這裡改用了relationship來做外鍵關係,代碼如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,ForeignKey,UniqueConstraint,Index,String from sqlalchemy.orm import sessionmaker,relationship from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://[email protected]:3306/db1') Base = declarative_base() class Son(Base): __tablename__ = 'son' id = Column(Integer,primary_key=True) name = Column(String(32)) age = Column(String(32)) father_id = Column(Integer,ForeignKey('father.id')) class Father(Base): __tablename__ = 'father' id = Column(Integer,primary_key=True) name = Column(String(32)) age = Column(String(32)) son = relationship('Son') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() f1 = Father(name = 'zhangyanlin',age = '18') w1 = Son(name = 'xiaozhang1',age = '3') w2 = Son(name = 'xiaozhang2',age = '4') # 重點是這裡綁定關係 f1.son = [w1,w2] # 只需要把父親給傳進去,兒子的自然就上傳進去啦 session.add(f1) session.commit()