一個初學者的辛酸路程-python操做SQLAlchemy-13

前言

  其實一開始寫blog,我是拒絕的,可是,沒辦法,沒有任何理由抗拒。今天呢,要說的就是如何使用Python來操做數據庫。python

SQLAlchemy

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()
有個問題,上面須要我寫原生的SQL語句來使用。若是寫原生,本身增刪改,若是簡單還行,複雜就很麻煩了,重用性不強,由於都是寫死在裏面,若是數據庫結果變化就的改,對擴展什麼都不方便,包括
SQL水平也就通常般,不少狀況寫不出高效的SQL語句,涉及到軟件好慢好慢,加機器都很差使。
爲了不,咱們把原生SQL寫死到源代碼裏,怎麼辦呢?就要引入下面的東西。
SQLAlchemy是python編程語言下的一款ORM框架,該框架創建在數據庫API之上,使用關係對象映射進行數據庫操做。簡言之即是:將對象轉換成SQL,而後使用數據API執行SQL並獲取執行結果。
這樣,就不用寫原生的SQL了。

因此咱們引入了ORM,什麼是ORM?session

ORM就是對象映射關係程序。 至關於ORM幫咱們把對象裏的轉化成SQL而後跟數據庫交互

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)
打印結果
[<1 name:alex>, <2 name:jack>]

修改,原理就是搜索出來,而後賦值

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()
相關文章
相關標籤/搜索