溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python連接數(shù)據(jù)庫操作sqlalchemy的方式

發(fā)布時間:2020-10-26 10:50:31 來源:億速云 閱讀:605 作者:小新 欄目:編程語言

這篇文章主要介紹python連接數(shù)據(jù)庫操作sqlalchemy的方式,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

sqlalchemy是什么呢?其實它就是一個程序,是經(jīng)常使用的關(guān)系程序,應(yīng)用十分廣泛,所以學(xué)習(xí)好sqlalchemy是非常重要的,結(jié)合知識點以及下面示例,很輕松的學(xué)會這部分內(nèi)容。

1、ORM框架

常見的ORM框架

1)SQLAlchemy:SQLAlchemy

2)SQLObject

3)Storm

4)Django's ORM

2、SQLAlchemy介紹

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

SQLALchemy本身無法操作數(shù)據(jù)庫,需要依賴pymysql第三方模塊,Dialect用于和數(shù)據(jù)API進行交流,根據(jù)配置文件的不同調(diào)用不同的數(shù)據(jù)庫API,從而實現(xiàn)對數(shù)據(jù)庫的操作

使用pymysql連接數(shù)據(jù)庫格式:

mysql + pymysql: / / <username>:<password>@<host> / <dbname>[?<options>]

3、安裝SQLAlchemy與檢查是否安裝成功

#安裝
pip install SQLAlchemy
#檢查是否安裝成功
C:\Users\lsl\Desktop>python
Python 3.7.0rc1 (v3.7.0rc1:dfad352267, Jun 12 2018, 07:05:25) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlalchemy
>>> sqlalchemy.__version__
'1.3.18'復(fù)制代碼

4、使用SQLAlchemy操作數(shù)據(jù)庫的表——創(chuàng)建對象

from sqlalchemy import create_engine
# 連接本地test數(shù)據(jù)庫
engine = create_engine('mysql+pymysql://root:root@localhost:3306/testdab',#數(shù)據(jù)庫類型是mysql,采用pymysql數(shù)據(jù)庫驅(qū)動來連接,用戶名是root,密碼也是root,連接本地數(shù)據(jù)庫testdab(連接的數(shù)據(jù)庫要是已存在的,就是你本地已有的數(shù)據(jù)庫)
                       encoding='utf-8',  # 編碼格式
                       echo=True,  # 是否開啟sql執(zhí)行語句的日志輸出
                       pool_recycle=-1,  # 多久之后對線程池中的線程進行一次連接的回收(重置) (默認為-1),其實session并不會被close
                       poolclass=NullPool  # 無限制連接數(shù)
                       )復(fù)制代碼

5、簡單查詢——使用SQL語句

result = engine.execute("select * from students")//在execute()里的參數(shù)是查詢的sql語句
print(result.fetchall()) //打印出查詢的結(jié)果復(fù)制代碼

6、創(chuàng)建映射

創(chuàng)建一個py文件來做數(shù)據(jù)表的映射text2.py

#引入要使用的declarative_base
from sqlalchemy.ext.declarative import declarative_base
#在要映射的數(shù)據(jù)表students中有id,name兩個字段,所以要引入Integer對應(yīng)id,String對應(yīng)name
from sqlalchemy import Column, Integer, String
#聲名Base
Base = declarative_base()
#User類就是對應(yīng)于 __tablename__ 指向的表,也就是數(shù)據(jù)表students的映射
class User(Base):
#students表是我本地數(shù)據(jù)庫testdab中已存在的
    __tablename__ = 'students'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64),nullable=False)
    __table_args__ = {
        "mysql_charset": "utf8"
}復(fù)制代碼

7、查詢

查詢students表中所有的數(shù)據(jù)

result = mySession.query(News).all()
print(result[0])復(fù)制代碼

查詢students表中第一條數(shù)據(jù)

result = mySession.query(User).first()
print(result.name) #打印對象屬性復(fù)制代碼

通過id查詢數(shù)據(jù)(id=2)

result = mySession.query(User).filter_by(id=2).first()
print(result.name)復(fù)制代碼

自定義過濾條件

result = mySession.query(User).filter(text("id>:id")).params(id=2).all()復(fù)制代碼

根據(jù)主鍵查詢

result = mySession.query(User).get(2)復(fù)制代碼

8、增加數(shù)據(jù)

user = User(name="小紅")
mySession.add(user)
mySession.commit()
復(fù)制代碼

9、刪除數(shù)據(jù)

mySession.query(User).filter(User.id == 1).delete()
mySession.commit()復(fù)制代碼

10、修改數(shù)據(jù)

mySession.query(User).filter(User.name=="小紅").update({"name":"小白"})
mySession.commit()復(fù)制代碼

11、常用條件查詢代碼

表名: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_ 條件或者關(guān)系
#查詢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復(fù)制代碼

流程總代碼:

#import
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
 
#創(chuàng)建連接對象也就是為了連接到本地的數(shù)據(jù)庫
engine = create_engine('mysql+pymysql://root:root@localhost:3306/testdab',
                       encoding='utf-8',  # 編碼格式
                       echo=True,  # 是否開啟sql執(zhí)行語句的日志輸出
                       pool_recycle=-1,  # 多久之后對線程池中的線程進行一次連接的回收(重置) (默認為-1),其實session并不會被close
                       poolclass=NullPool  # 無限制連接數(shù)
                       )
#聲名Base
Base = declarative_base()
 
# 創(chuàng)建會話
session = sessionmaker(engine)
mySession = session()
 
# 創(chuàng)建類,繼承基類,用基本類型描述數(shù)據(jù)庫結(jié)構(gòu)
class User(Base):
    __tablename__ = 'students'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64),nullable=False)
    __table_args__ = {
        "mysql_charset": "utf8"
    }
#sql語句查詢
result = engine.execute("select * from students")
print(result.fetchall())
 
# 查詢第一條
result = mySession.query(User).first()
print(result.name) #打印對象屬性
 
# 查詢所有
result = mySession.query(User).all()
print(result[0])
 
# 查詢id為2的
result = mySession.query(User).filter_by(id=2).first()
print(result.name)
 
# 分頁查詢 0,2
result = mySession.query(User).filter(User.id>1).limit(2).offset(0).all()
print(result)
 
#插入新數(shù)據(jù)
user = User(name="小紅")
mySession.add(user)
mySession.commit()
result = mySession.query(User).filter_by(name="小紅").first()
print(result.name)
 
 
#修改已有數(shù)據(jù)
mySession.query(User).filter(User.name=="小紅").update({"name":"小白"})
mySession.commit()
result = mySession.query(User).filter_by(name="小白").first()
print(result.name)
 
#刪除數(shù)據(jù)
mySession.query(User).filter(User.id == 1).delete()
mySession.commit()
result = mySession.query(User).first()
print(result.name) #打印對象屬性復(fù)制代碼

以上是python連接數(shù)據(jù)庫操作sqlalchemy的方式的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI