其實一開始寫blog,我是拒絕的,可是,沒辦法,沒有任何理由抗拒。今天呢,要說的就是如何使用Python來操做數據庫。python
SQLAlchemy是Python編程語言下的一款ORM框架,該框架創建在數據庫API智商,使用關係對象映射進行數據庫操做,換句話說就是:將對象轉換成SQL,而後使用數據API執行SQL語句並獲取到執行結果。mysql
之前咱們經常使用pymysql來操做數據庫,舉個栗子sql
(須要提早安裝上pymysql)數據庫
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie import pymysql #建立鏈接 conn = pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb') #建立遊標 socket上創建的實例 cursor=conn.cursor() #執行SQL,並返回行數,用遊標執行, effect_row = cursor.execute("select * from student") # print(cursor.fetchone()) # print(cursor.fetchone()) print(cursor.fetchall())
這樣就能夠把數據所有取出來。編程
插入數據呢?windows
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie import pymysql #建立鏈接 conn = pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb') #建立遊標 socket上創建的實例 cursor=conn.cursor() #執行SQL,並返回行數,用遊標執行, #effect_row = cursor.execute("select * from student") # print(cursor.fetchone()) # print(cursor.fetchone()) # print(cursor.fetchall()) data = [ ("N1","2015-05-22",'M'), ("N2","2015-05-22",'M'), ("N3","2015-05-22",'M'), ("N4","2015-05-22",'M'), ] cursor.executemany("insert into student (name,register_date,gender) values(%s,%s,%s)",data ) conn.commit()
因此咱們引入了ORM,什麼是ORM?session
ORM的優勢:數據結構
一、隱藏了數據訪問細節,封閉的通用數據庫交互,ORM的核心,它使得咱們的通用數據庫交互變得簡單易行,而且徹底不用考慮該死的SQL語句。快速開發,由此而來。app
二、ORM使咱們構造固化數據結構變得簡單易行。框架
缺點:
一、無可避免,自動化意味着映射和關聯管理,代價是犧牲性能
ORM是一個術語,不是一個軟件,基於ORM的標準下,有不少軟件,最執行的就是SQLAlchemy ,(SQL 阿哥迷)
如何使用?
windows下安裝
pip install sqlalchemy
接下來利用ORM實現一個建立表的功能
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8',echo=True) #echo=True,就是把整個過程打印出來 Base=declarative_base() #生成ORM基類 class User(Base): __tablename__ = 'user' #表名 id = Column(Integer,primary_key=True) #字段,整形,主鍵 column是導入的 name = Column(String(32)) password = Column(String(64)) Base.metadata.create_all(engine) #建立表結構
實現結果,就是在數據庫建立了一個表,user,再次執行,若是數據庫有,它就不會建立了。
插入數據
''' 建立數據,有個遊標的東西叫作sessionmaker須要單獨導入 ''' #實例與socket綁定,建立與數據庫的繪畫session class,注意,這裏返回 #給session的是一個class,不是實例 Session_class = sessionmaker(bind=engine) #生成session實例,cursor Session = Session_class() #生產你要建立的數據對象 xiedi_obj = User(name="alex",password="123") xiedi_obj2 = User(name="jack",password="123") #目前尚未建立對象,能夠打印看看,上面只是申明 print(xiedi_obj.name,xiedi_obj.id) #把要建立的數據對象添加到這個session裏,一會同一建立 Session.add(xiedi_obj) Session.add(xiedi_obj2) #這裏依舊沒有建立 print(xiedi_obj.name,xiedi_obj.id) #如今才同一提交,建立數據 Session.commit()
查詢
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie ''' 利用ORM實現一個建立表的功能 ''' 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://root:root@192.168.56.11/oldboydb",encoding='utf-8') Base = declarative_base() #生成ORM基類 #建立表結構 class User(Base): __tablename__ = 'xiedi' #表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<%s name:%s>" % (self.id,self.name) #直接調用基類下的方法,建立表結構 Base.metadata.create_all(engine) ''' 查看 ''' T1 = sessionmaker(bind=engine) T2 = T1() #filter查出來的是一組數據,它不知道你要查多少 data = T2.query(User).filter_by().all() print(data)
修改,原理就是搜索出來,而後賦值
data = Session.query(User).filter(User.id>1).filter(User.id<4).first() print(data) data.name = "Jack Liu" data.password = "Shit happens" #提交 Session.commit()
統計
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie ''' 利用ORM實現一個建立表的功能 ''' 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://root:root@192.168.56.11/oldboydb",encoding='utf-8') Base = declarative_base() #生成ORM基類 #建立表結構 class User(Base): __tablename__ = 'xiedi' #表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) #直接調用基類下的方法 Base.metadata.create_all(engine) #實例與socket綁定,建立與數據庫的繪畫session class,注意,這裏返回 #給session的是一個class,不是實例 Session_class = sessionmaker(bind=engine) #生成session實例,cursor Session = Session_class() #建立用戶 fake_user = User(name='rain',password="12345") Session.add(fake_user) print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all()) Session.rollback() print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all()) print(Session.query(User).filter(User.name.in_(['Jack','rain'])).count()) 打印結果 1
那麼如何取分組呢?統計每一個名字出現多少次
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie ''' 利用ORM實現一個建立表的功能 ''' 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://root:root@192.168.56.11/oldboydb",encoding='utf-8') Base = declarative_base() #生成ORM基類 #建立表結構 class User(Base): __tablename__ = 'xiedi' #表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) #直接調用基類下的方法,建立表結構 Base.metadata.create_all(engine) ''' 建立數據,有個遊標的東西叫作sessionmaker須要單獨導入 ''' #實例與socket綁定,建立與數據庫的繪畫session class,注意,這裏返回 #給session的是一個class,不是實例 Session_class = sessionmaker(bind=engine) #生成session實例,cursor Session = Session_class() from sqlalchemy import func print(Session.query(User.name,func.count(User.name)).group_by(User.name).all()) 打印結果 [('alex', 1, 'alex'), ('Jack Liu', 1, 'Jack Liu')]
外鍵關聯
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String,DATE,Enum from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8') #echo=True,就是把整個過程打印出來 Base=declarative_base() #生成ORM基類 class User(Base): __tablename__ = 'user' #表名 id = Column(Integer,primary_key=True) #字段,整形,主鍵 column是導入的 name = Column(String(32)) password = Column(String(64)) def __repr__(self): return "<%s name:%s>" % (self.id,self.name) class Student(Base): __tablename__ = 'student' #表名 id = Column(Integer,primary_key=True) #字段,整形,主鍵 column是導入的 name = Column(String(32),nullable=False) register_date = Column(DATE,nullable=False) gender = Column(String(32),nullable=False) def __repr__(self): return "<%s name:%s>" % (self.id,self.name) Base.metadata.create_all(engine) #建立表結構 Session_class = sessionmaker(bind=engine) Session = Session_class() # s1 = Student(name="s2",register_date="2015-03-01",gender="F") # Session.add(s1) print(Session.query(User,Student).filter(User.id==Student.id).all()) Session.commit()