Python--數(shù)據(jù)庫sqlalchemy

1.什么是sqlalchemy?

sqlalchemy是Python ORM的開源框架妈嘹,使用它可以快速方便的構建數(shù)據(jù)庫模型

2.如何使用sqlalchemy柳琢?

1.安裝

pip3 install sqlalchemy

2.導包

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

3.連接

engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:3306/test?charset=utf8',
                       max_overflow=0,  # 超過連接池大小外最多創(chuàng)建的連接,為0表示超過5個連接后,其他連接請求會阻塞 (默認為10)
                       encoding='utf-8',  # 編碼格式
                       echo=True,  # 是否開啟sql執(zhí)行語句的日志輸出
                       pool_timeout=30,  # 連接線程池中柬脸,沒有連接時最多等待的時間他去,不設置無連接時直接報錯 (默認為30)
                       pool_recycle=-1,  # 多久之后對線程池中的線程進行一次連接的回收(重置) (默認為-1),其實session并不會被close
                       poolclass=NullPool  # 無限制連接數(shù)
                       )

4.創(chuàng)建 session

#聲名Base
Base = declarative_base()

# 創(chuàng)建數(shù)據(jù)表
Base.metadata.create_all(engine)

#創(chuàng)建session
db_session = sessionmaker(bind=engine)

5.創(chuàng)建表

# 創(chuàng)建類,繼承基類倒堕,用基本類型描述數(shù)據(jù)庫結構
class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True, )
    name = Column(String(64))
    psw = Column(String(64))
    psw_remark = Column(String(128))
    __table_args__ = {
        "mysql_charset": "utf8"
    }

    def obj_2_json(self):
        return {
            'id': self.id,
            'name': self.name,
            'psw': self.psw,
            'psw_remark': self.psw_remark
        }

    def __repr__(self):
        return 'id:%d,name=%s,psw=%s,psw_remark=%s' % (self.id if self.id else 0, self.name, self.psw, self.psw_remark)

6.操作表

# 保存記錄
def save(user):
    is_success = True
    session = db_session()
    try:
        session.add(user)
        session.commit()
        print(user)
    except BaseException:
        is_success = False
        print('error=', traceback.format_exc())
    session.close()
    return is_success
# 根據(jù)ID刪除
def delete(id):
    is_success = True
    session = db_session()
    try:
        print(user)
        session.query(User).filter(User.id == id).delete()
        session.commit()
    except BaseException:
        is_success = False
        print('error=', traceback.format_exc())
    session.close()
    return is_success
# 修改
def update(user):
    is_success = True
    session = db_session()
    try:
        print(user)
        session.query(User).filter(User.id == user.id).update({User.name: user.name})
        session.commit()
    except BaseException:
        is_success = False
        print('error=', traceback.format_exc())
    session.close()
    return is_success
# 查詢單條
def queryOne(name):
    session = db_session()
    user = session.query(User).filter(User.name == name).limit(1).one()
    session.close()
    return user
# 條件查詢
def query():
    session = db_session()
    list = session.query(User).filter(User.name == '唐人').all()
    session.close()
    return list
#查詢所有
def queryAll():
    session = db_session()
    list = session.query(User).all()
    session.close()
    return list

7.條件查詢總結

表名:User

1.條件查詢
session.query(User).filter(User.name=='張三'){
                                               .all()   查詢所有
                                               .one()   查詢單個(如果存在多個會異常)
                                               .first() 查詢符合條件的第一個
                                               .limit(1).one() limit限制查詢灾测,limit(1).one()升級第一個
                                               .count()  查詢符合條件的總個數(shù)
                                               }

2.主鍵查詢
session.query(User).get(0)  查詢主鍵ID=0

3.offset(n) 限制前面n個,顯示后面n+1個
#查詢出第三個后面的所有
session.query(User).offset(3).all()

4.slice()切片
#slice(1,3) 與python的slice一致垦巴,從0開始 左閉右開媳搪,顯示1,2兩個元素
session.query(User).slice(1,,3).all()

5.order_by() 默認升序
session.query(User).order_by(User.id).all()

6.desc() 降序
session.query(User).order_by(desc(User.id)).all()

7.like 模糊匹配,與sql一樣
session.query(User).filter(User.neme.like('%吳')).add()

8.notlike 與7相反


form operator import *

9.in_() 包含
#查詢是否包含唐人骤宣、吳新喜這個用戶的信息
session.query(User).filter(User.name.in_(['唐人','吳新喜'])).all()


10.notin_() 不包含

11.is_  兩種表達方式 None
#查詢所有手機號為null的信息
session.query(User).filter(User.phone==None).all()
session.query(User).filter(User.phone.is_(None)).all()

12. isnot()

13. or_ 條件或者關系
#查詢name==吳新喜或者唐人的用戶信息
session.query(User).filter(or_(User.name=='唐人',User.name=='吳新喜'))

聚合函數(shù)

1.count group_by
#查詢所有的密碼并且計算其相同的個數(shù)
from sqlalchemy import func
ssession.query(db_user.psw,func.count(db_user.psw)).group_by(db_user.psw).all()

2.having
having字句可以讓我們篩選成組后的各種數(shù)據(jù)秦爆,where字句在聚合前先篩選記錄,也就是說作用在group by和having字句前憔披。
而having子句在聚合后對組記錄進行篩選等限。真實表中沒有此數(shù)據(jù),這些數(shù)據(jù)是通過一些函數(shù)生存芬膝。
即先成組在篩選

#查詢所有的密碼并且計算其相同的個數(shù),having條件相同密碼總數(shù)大于1的數(shù)據(jù)
ssession.query(db_user.psw,func.count(db_user.psw)).group_by(db_user.psw).having(func.count(db_user.psw)>1).all()

3.sum
#計算所有id的總和
ssession.query(func.sum(db_user.id)).all()

4.max
#最大的ID
 ssession.query(func.max(db_user.id)).all()

5.min
#最小的id
 ssession.query(func.min(db_user.id)).all()

6.lable 別名
lable別名不能用在having中

7.extract 提取時間元素
from sqlalchemy import extract
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末望门,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锰霜,更是在濱河造成了極大的恐慌筹误,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈遥,死亡現(xiàn)場離奇詭異纫事,居然都是意外死亡勘畔,警方通過查閱死者的電腦和手機所灸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炫七,“玉大人爬立,你說我怎么就攤上這事⊥蚰模” “怎么了侠驯?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奕巍。 經(jīng)常有香客問我吟策,道長,這世上最難降的妖魔是什么的止? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任檩坚,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘匾委。我一直安慰自己拖叙,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布赂乐。 她就那樣靜靜地躺著薯鳍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挨措。 梳的紋絲不亂的頭發(fā)上挖滤,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音运嗜,去河邊找鬼壶辜。 笑死,一個胖子當著我的面吹牛担租,可吹牛的內(nèi)容都是我干的砸民。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼奋救,長吁一口氣:“原來是場噩夢啊……” “哼岭参!你這毒婦竟也來了?” 一聲冷哼從身側響起尝艘,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤演侯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后背亥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秒际,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年狡汉,在試婚紗的時候發(fā)現(xiàn)自己被綠了娄徊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡盾戴,死狀恐怖寄锐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尖啡,我是刑警寧澤橄仆,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站衅斩,受9級特大地震影響盆顾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畏梆,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一您宪、第九天 我趴在偏房一處隱蔽的房頂上張望惫搏。 院中可真熱鬧,春花似錦蚕涤、人聲如沸筐赔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茴丰。三九已至,卻和暖如春天吓,著一層夾襖步出監(jiān)牢的瞬間贿肩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工龄寞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汰规,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓物邑,卻偏偏與公主長得像溜哮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子色解,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容