日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python SQLAlchemy庫的使用方法

瀏覽:16日期:2022-07-08 14:46:16

一、SQLAlchemy簡介

1.1、SQLAlchemy是什么?

sqlalchemy是一個python語言實現的的針對關系型數據庫的orm庫。可用于連接大多數常見的數據庫,比如Postges、MySQL、SQLite、Oracle等。

1.2、為什么要使用SQLAlchemy?

它將你的代碼從底層數據庫及其相關的SQL特性中抽象出來。

1.3、SQLAlchemy提供了兩種主要的使用模式

SQL表達式語言(SQLAlchemy Core) ORM

1.4、應該選擇哪種模式?

雖然你使用的框架中已經內置了ORM,但是希望添加更強大的報表功能,請選用Core。如果你想在一個一模式為中心的視圖中查看數據(用戶類似于SQL),請使用Core。如果你的數據不需要業務對象,請使用Core。如果你要把數據看作業務對象,請使用ORM。如果你想快速創建原型,請使用ORM。如果你需要同事使用業務對象和其他與問題域無關的數據,請組合使用Core和ORM。

1.5、連接數據庫

要連接到數據庫,需要先創建一個SQLAlchemy引擎。SQLAlchemy引擎為數據庫創建一個公共接口來執行SQL語句。這是通過包裝數據庫連接池和方言(不同數據庫客戶端)來實現的。

SQLAlchemy提供了一個函數來創建引擎。在這個函數中,你可以指定連接字符串,以及其他一些可選的關鍵字參數。

from sqlalchemy import create_engineengine = create_engine(’sqlite:///cookies.db’)engine1 = create_engine(’sqlite:///:memory:’)engine2 = create_engine(’sqlite://///home/cookiemonster/cookies.db’)engine3 = create_engine(’sqlite:///c:Userscookiemonstercookies.db’)engine_mysql = create_engine(’mysql+pymysql://cookiemonster:chocolatechip’, ’@mysql01.monster.internal/cookies’, pool_recycle=3600)

1.6、模式和類型

為了訪問底層數據庫,SQLAlchemy需要用某種東西來代表數據庫中的表。為此,可以使用下面三種方法總的一種:

使用用戶定義的Table對象使用代表數據表的聲明式類從數據庫中推斷

二、SQLAlchemy core

SQLAlchemy core定義表結構使用的是1.5中說的第1種方式。table對象包含一系列帶有類型的列和屬性,它們與一個常見的元數據容器相關聯。

元數據可以看作是一種Table對象目錄。這些表可以通過MetaData.tables來訪問。

2.1、定義表結構

在SQLAlchemy Core中,我們通過Table構造函數來初始化Table對象。我們要在構造函數中提供MetaData對象(元數據)和表名,任何其他參數都被認為是列對象。列是通過Column()函數創建的。

from sqlalchemy import create_enginefrom sqlalchemy import Columnfrom sqlalchemy import Integerfrom sqlalchemy import Stringfrom sqlalchemy import MedaDatametadata = MetaData()user = table(’user’, metadata, Column(id, Integer(), primary_key=True), Column(name, String(255)), )engine = create_engine(’sqlite:///:memory:’)metadata.create_all(engine) # 表的持久化

2.2、插入數據

首先創造一條insert語句,用來把小明放入user表中。為此,先調用user表的insert()方法,然后再使用values()語句,關鍵字參數為各個列及相應值:

ins = user.insert().values(id=1, name=’小明’)print(str(ins))

到此僅僅只是創建了一個inset語句,還沒有真正執行呢,接下來執行插入操作:

connection = engine.connect()result = connection.execute(ins)print(result.inserted_primary_key)

2.3、查詢數據

構建查詢時,要用到select函數,它類似于標準SQL SELECT語句。

from sqlalchemy.sql import selects = select([user])# 可以使用str(s)查看數據庫看到的語句print(str(s))rp = connection.execute(s)results = rp.fetchall()

2.3.1、ResultProxy

execute()函數的返回值是一熱ResultProxy對象,它允許使用索引、名稱或Column對象進行訪問。

使用ResultProxy處理行

first_row = results[0]first_row[1]first_row.namefirst_row[user.c.name]

迭代ResultProxy

rp = connection.execute(s)for record in rp:print(record.user_name)

使用方法訪問結果

rp.first() # 若有記錄,則返回第一個記錄并關閉連接rp.fetchone() # 返回一行,并保持光標為打開狀態,以便你做更多獲取調用rp.scalar() # 入股查詢結果是包含一個列的單條記錄,則返回單個值

2.3.2、控制查詢中的列數

s = select([user.c.name])rp = connection.execute(s)print(rp.keys())result = rp.first()

2.3.3、排序

s = select([user.c.name])s = s.order_by(user.c.name)rp = connection.execute(s)for user in rp:print(user.name)

2.3.4、限制返回結果集的條數

s = select([user.c.name])s = s.order_by(user.c.name)s = s.limit(2)rp = connection.execute(s)for user in rp:print(user.name)

2.3.5、內置SQL函數和標簽

from sqlalchemy.sql import funcs = select([func.sum(user.c.score)])rp = connection.execute(s)print(rp.scalar())

2.3.6、過濾

對查詢過濾是通過添加where()語句來完成的。

s = select([user]).where(user.c.name == ’小明’)rp = connection.execute(s)record = rp.first()print(record.items())

這里只是介紹了常用的查詢方法,更多復雜的查詢請查閱官方文檔。

2.4、更新數據

update()方法和前面的insert()方法很相似,它們的語法幾乎完全一樣,但是update()可以指定一個where()子句,用來指出要更新哪些行。

from sqlalchemy import updateu = update(user).where(user.c.name == ’小明’)u = u.values(name=’小華’)result = connection.execute(u)print(result.rowcount)

2.5、刪除數據

創建刪除語句時,既可以使用delete()函數,也可以使用表的delete()方法。與insert()和update()不同,delete()不接收值參數,只接收一個可選where子句,用來指定刪除范文。

from sqlalchemy import deleteu = delete(user).where(user.c.name == ’小華’)result = connection.execute(u)print(result.rowcount)

注意:

更多的高級操作:連接、別名、分組、鏈式調用、原始查詢等,請查閱官方文檔。

2.5、事務

通過connection.begin()開啟一個事務,返回一個transaction對象,接下來根據執行的情況調用transaction.commit()提交修改或者調用transaction.rollback()回滾操作。

三、SQLAlchemy orm

SQLAlchemy orm定義表結構使用的是1.5中說的第2種方式。通過定義一個類,它繼承自一個名為declarative_base的特殊基類。declarative_base把元數據容器和映射器(用來把類映射到數據表)結合在一起。

orm使用的類應該滿足如下四個要求:

繼承自declarative_base對象。 包含__tablename__,這是數據庫中使用的表名。 包含一個或多個屬性,它們都是column對象。 確保一個或多個屬性組成主鍵。

3.1、定義表結構:

from sqlalchemy import create_enginefrom sqlalchemy import Columnfrom sqlalchemy import Integerfrom sqlalchemy import Stringfrom sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class User(Base): __tablename__ = ’user’ id = Column(Integer, primary_key=True)name = Column(String(255))engine = create_engine(’sqlite:///’)Base.metadata.create_all(engine)Session = sessionmaker(bind=engine)session = Session()

3.2、會話(session)

會話是SQLAlchemy ORM和數據庫交互的方式。它通過引擎包裝數據庫連接,并為通過會話加載或與會話關聯的對象提供標識映射(identity map)。標識映射是一種類似于緩存的數據結構,它包含由對象表和主鍵確定的一個唯一的對象列表。會話還包裝了一個事務,這個事務將一直保持打開狀態,直到會話提交或回滾。

為創建會話,SQLAlchemy提供了一個sessionmaker類,這個類可以確保在整個應用程序中能夠使用相同的參數創建會話。sessionmaker類通過創建一個Session類來實現這一點,Session類是根據傳遞給sessionmaker工廠的參數配置的。

from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerengine = create_engine(’sqlite:///:memory:’)Session = sessionmaker(bind=engine)session = Session()

3.3、插入

user = User(1, ’小明’)session.add(user)session.commit()

3.4、查詢

for row in session.query(User):print(row.id, row.name)

注意:session.query()的返回值是Query對象,不能使用它的返回值作為查詢結果。關于Query對象的用法,請參閱:https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query

常用Query對象的方法:

q = session.query(User)q.count() # 獲取查詢結果的數量q.all() # 返回查詢結果的list,會觸發執行SQL查詢q.get(id) # 根據primary_key查詢單個對象q.as_scalar() # 返回此次查詢的SQL語句

3.4.1、控制查詢中的列數

print(session.query(user.name).first())

3.4.2、排序

for record in sesssion.query(user).order_by(user.name):print(user.name)

3.4.3、限制返回結果集的條數

query = session.query(user).order_by(user.name).[:2]print([result.user_name for result in query])

3.4.4、內置SQL函數和標簽

from sqlalchemy import funcinv_count = session.query(func.sum(user.name)).scalar()print(inv_count)

3.4.5、過濾

record = session.query(user).filter(user.name == ’小華’)print(record)

3.5、更新數據

query = session.query(user)xm_user = query.filter(user.user_name == ’小華’).first()xm_user.name = ’robin’session.commit()print(xm_user.quantity)

3.6、刪除數據

query = session.query(user)xm_user = query.filter(user.user_name == ’小華’).first()session.delete(xm_user)session.commit()print(xm_user)

注意:

這里簡單介紹了SQLAlchemy orm的常見用法,更高級的用法請查閱官方文檔。

四、反射

使用反射技術可以利用先用數據庫填充SQLAlchemy對象。

4.1、反射單個表

創建初始對象:

from sqlalchemy import Metadata, create_enginesmetadata = MetaData()engine = reate_engine(’sqlite:///’)

反射Artist表

from sqlalchmy impport Tableartist = Table(’Artist’, metadata, autoload=True, autoload_with=engine)

4.2、反射整個數據庫

metadata.reflect(bind=engine)

參考資料

https://docs.sqlalchemy.org/en/13/core/type_basics.html#generic-types

以上就是Python SQLAlchemy庫的使用方法的詳細內容,更多關于Python SQLAlchemy庫的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久成人亚洲| 久久国产免费看| 欧美激情一区| 麻豆传媒一区二区三区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 亚洲资源在线| 日本va欧美va精品| 日韩不卡免费视频| 国产欧美啪啪| 免费一二一二在线视频| 高清一区二区| 亚洲电影在线一区二区三区| 久久精品官网| 免费人成在线不卡| 国产日韩免费| 不卡福利视频| 中文字幕日韩高清在线| 麻豆精品国产91久久久久久| 青青久久av| 免费不卡在线视频| 欧美国产91| 你懂的国产精品| 精品久久亚洲| 三级在线观看一区二区| 日本一区二区三区视频在线看 | 精品伊人久久久| 日韩另类视频| 天堂精品久久久久| 国产精品日本一区二区不卡视频 | 日产精品一区| 黑丝一区二区三区| 国产日韩欧美高清免费| 免费欧美一区| 国产精成人品2018| 蜜臀久久99精品久久一区二区 | 亚洲性视频h| 欧美中文一区| 亚洲精品在线观看91| 国产精品一级| 亚洲黄色在线| 蜜桃av.网站在线观看| 日本少妇精品亚洲第一区| 精品久久电影| 日本精品在线播放| 国产一区久久| 天堂8中文在线最新版在线| 欧美亚洲一区二区三区| 久久av在线| 黑丝一区二区三区| 91亚洲国产高清| 婷婷综合社区| av一区二区高清| 激情婷婷欧美| 欧美一级专区| | 蜜臀久久久99精品久久久久久| 国产v综合v| 久久青草久久| 99久久亚洲精品| 今天的高清视频免费播放成人| 深夜视频一区二区| 精品在线91| 日韩在线一二三区| 亚洲性视频在线| 国产精品1区| 日韩一区欧美| 蜜桃国内精品久久久久软件9| 黄色国产精品| 亚洲欧美日本国产| 青草综合视频| 免费日韩一区二区三区| 国产精区一区二区| 国产不卡av一区二区| 91精品一区国产高清在线gif | 免费福利视频一区二区三区| 蜜桃视频欧美| 色8久久久久| 成人亚洲一区二区| 亚洲少妇在线| 精品国产三区在线| 91久久黄色| 国产精品18| 激情欧美一区二区三区| 男人操女人的视频在线观看欧美| 蜜臀精品一区二区三区在线观看 | 国产亚洲人成a在线v网站| 国产精品成人一区二区不卡| 天堂成人免费av电影一区| 国产精品久久久久久久久久妞妞| 国产一区二区三区91| 欧美日韩激情在线一区二区三区| 黄色欧美日韩| 久久伊人亚洲| 欧美日韩免费观看一区=区三区 | 黄色成人精品网站| 欧美激情亚洲| 影音先锋久久精品| 国产一区一一区高清不卡| 黄页网站一区| 久久精品资源| 午夜电影一区| 亚洲精品成人| 涩涩av在线| 国产精品4hu.www| 国产精品天堂蜜av在线播放| 日韩三级精品| 免费成人网www| 91欧美在线| 国产精品入口久久| 亚洲另类av| 香蕉国产精品| 国产精品777777在线播放| 视频在线观看91| aⅴ色国产欧美| 免费精品国产| 婷婷综合激情| 91久久中文| 久久福利精品| 国产视频一区三区| 日韩精品91| 欧产日产国产精品视频| 成人在线丰满少妇av| 久久不见久久见国语| 国产乱码精品| 麻豆精品一区二区综合av| 久久不卡国产精品一区二区| 国产精品一级在线观看| 久久精品免费看| 亚洲最新无码中文字幕久久| 久久美女精品| 免费视频亚洲| 综合激情婷婷| 国产精品日本一区二区不卡视频| 欧美日韩夜夜| 国产精品密蕾丝视频下载| 免费亚洲婷婷| 播放一区二区| 丝袜美腿成人在线| 91精品国产自产观看在线| 欧美国产三级| 日韩电影二区| 影音先锋久久| 久久国产三级| 久久精品卡一| 亚洲aa在线| 超碰99在线| 亚洲我射av| 成人亚洲一区二区| 亚洲伊人精品酒店| 精品资源在线| 欧美日韩国产欧| 91亚洲精品在看在线观看高清| 精品视频黄色| 天堂av在线一区| 国内揄拍国内精品久久| 西西人体一区二区| 精品一区二区三区四区五区| 亚洲成人精选| 精品一区二区三区免费看| 国产亚洲一区在线| 红杏一区二区三区| 亚洲精品第一| 婷婷精品视频| 久久久久观看| 三级亚洲高清视频| 久久精品影视| 美女国产精品久久久| 婷婷久久免费视频| 国产专区一区| 国产激情一区| 国产精品腿扒开做爽爽爽挤奶网站| 国产精品久久久免费| 视频一区视频二区中文字幕| 黄色在线网站噜噜噜| 国产毛片精品| 日韩精品一区二区三区中文| 黄色亚洲免费| 欧美片第1页综合| 久久精品午夜| 综合亚洲色图| 一级欧洲+日本+国产| 国产精品yjizz视频网| 麻豆国产精品一区二区三区| 日韩一区精品视频| 日韩欧美精品一区| 91综合视频| 亚洲精品大片| 日韩**一区毛片| 国产伦一区二区三区| 国产精品色在线网站| 日本欧美大码aⅴ在线播放| 日本不卡一区二区| 欧美在线不卡| 欧美黑人巨大videos精品| 国产欧美一区二区三区米奇| 亚洲天堂日韩在线| 欧美综合精品| 久久女人天堂| 久久影院午夜精品| 91九色精品|