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

您的位置:首頁技術(shù)文章
文章詳情頁

Python SQLAlchemy庫的使用方法

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

一、SQLAlchemy簡介

1.1、SQLAlchemy是什么?

sqlalchemy是一個(gè)python語言實(shí)現(xiàn)的的針對關(guān)系型數(shù)據(jù)庫的orm庫。可用于連接大多數(shù)常見的數(shù)據(jù)庫,比如Postges、MySQL、SQLite、Oracle等。

1.2、為什么要使用SQLAlchemy?

它將你的代碼從底層數(shù)據(jù)庫及其相關(guān)的SQL特性中抽象出來。

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

SQL表達(dá)式語言(SQLAlchemy Core) ORM

1.4、應(yīng)該選擇哪種模式?

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

1.5、連接數(shù)據(jù)庫

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

SQLAlchemy提供了一個(gè)函數(shù)來創(chuàng)建引擎。在這個(gè)函數(shù)中,你可以指定連接字符串,以及其他一些可選的關(guān)鍵字參數(shù)。

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、模式和類型

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

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

二、SQLAlchemy core

SQLAlchemy core定義表結(jié)構(gòu)使用的是1.5中說的第1種方式。table對象包含一系列帶有類型的列和屬性,它們與一個(gè)常見的元數(shù)據(jù)容器相關(guān)聯(lián)。

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

2.1、定義表結(jié)構(gòu)

在SQLAlchemy Core中,我們通過Table構(gòu)造函數(shù)來初始化Table對象。我們要在構(gòu)造函數(shù)中提供MetaData對象(元數(shù)據(jù))和表名,任何其他參數(shù)都被認(rèn)為是列對象。列是通過Column()函數(shù)創(chuàng)建的。

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、插入數(shù)據(jù)

首先創(chuàng)造一條insert語句,用來把小明放入user表中。為此,先調(diào)用user表的insert()方法,然后再使用values()語句,關(guān)鍵字參數(shù)為各個(gè)列及相應(yīng)值:

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

到此僅僅只是創(chuàng)建了一個(gè)inset語句,還沒有真正執(zhí)行呢,接下來執(zhí)行插入操作:

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

2.3、查詢數(shù)據(jù)

構(gòu)建查詢時(shí),要用到select函數(shù),它類似于標(biāo)準(zhǔn)SQL SELECT語句。

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

2.3.1、ResultProxy

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

使用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)

使用方法訪問結(jié)果

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

2.3.2、控制查詢中的列數(shù)

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、限制返回結(jié)果集的條數(shù)

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、內(nèi)置SQL函數(shù)和標(biāo)簽

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())

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

2.4、更新數(shù)據(jù)

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

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

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

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

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

注意:

更多的高級(jí)操作:連接、別名、分組、鏈?zhǔn)秸{(diào)用、原始查詢等,請查閱官方文檔。

2.5、事務(wù)

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

三、SQLAlchemy orm

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

orm使用的類應(yīng)該滿足如下四個(gè)要求:

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

3.1、定義表結(jié)構(gòu):

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、會(huì)話(session)

會(huì)話是SQLAlchemy ORM和數(shù)據(jù)庫交互的方式。它通過引擎包裝數(shù)據(jù)庫連接,并為通過會(huì)話加載或與會(huì)話關(guān)聯(lián)的對象提供標(biāo)識(shí)映射(identity map)。標(biāo)識(shí)映射是一種類似于緩存的數(shù)據(jù)結(jié)構(gòu),它包含由對象表和主鍵確定的一個(gè)唯一的對象列表。會(huì)話還包裝了一個(gè)事務(wù),這個(gè)事務(wù)將一直保持打開狀態(tài),直到會(huì)話提交或回滾。

為創(chuàng)建會(huì)話,SQLAlchemy提供了一個(gè)sessionmaker類,這個(gè)類可以確保在整個(gè)應(yīng)用程序中能夠使用相同的參數(shù)創(chuàng)建會(huì)話。sessionmaker類通過創(chuàng)建一個(gè)Session類來實(shí)現(xiàn)這一點(diǎn),Session類是根據(jù)傳遞給sessionmaker工廠的參數(shù)配置的。

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對象,不能使用它的返回值作為查詢結(jié)果。關(guān)于Query對象的用法,請參閱:https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query

常用Query對象的方法:

q = session.query(User)q.count() # 獲取查詢結(jié)果的數(shù)量q.all() # 返回查詢結(jié)果的list,會(huì)觸發(fā)執(zhí)行SQL查詢q.get(id) # 根據(jù)primary_key查詢單個(gè)對象q.as_scalar() # 返回此次查詢的SQL語句

3.4.1、控制查詢中的列數(shù)

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、限制返回結(jié)果集的條數(shù)

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

3.4.4、內(nèi)置SQL函數(shù)和標(biāo)簽

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、更新數(shù)據(jù)

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

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

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

注意:

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

四、反射

使用反射技術(shù)可以利用先用數(shù)據(jù)庫填充SQLAlchemy對象。

4.1、反射單個(gè)表

創(chuàng)建初始對象:

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、反射整個(gè)數(shù)據(jù)庫

metadata.reflect(bind=engine)

參考資料

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

以上就是Python SQLAlchemy庫的使用方法的詳細(xì)內(nèi)容,更多關(guān)于Python SQLAlchemy庫的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩国产欧美一区二区三区| 欧美日韩亚洲一区在线观看| 麻豆视频一区| 国产精品一区三区在线观看| 日欧美一区二区| 人人爽香蕉精品| 视频一区二区不卡| 亚洲精品在线a| 日韩福利视频网| 国产精品亚洲产品| 清纯唯美亚洲综合一区| 久久国产日韩欧美精品| 国产精品宾馆| 麻豆国产91在线播放| 国产粉嫩在线观看| 久久高清免费| 视频在线观看一区| 日韩高清一级| 久久精品国产99国产| 亚洲精品成人图区| 午夜日韩av| 日韩av网站在线免费观看| 国产黄色一区| 高清av一区| 日韩高清电影免费| 精品国产亚洲一区二区三区在线| 鲁鲁在线中文| 巨乳诱惑日韩免费av| 日韩av影院| 日本高清久久| 色婷婷亚洲mv天堂mv在影片| 精品日韩视频| 久久av一区二区三区| 日本午夜精品久久久| 精品视频一区二区三区在线观看| 欧美高清一区| 7777精品| av综合电影网站| 日韩精品一二三区| 国产一区二区视频在线看| 久久国产欧美| 日韩高清在线观看一区二区| 欧洲av不卡| 亚洲精品一级二级三级| 电影91久久久| 久久午夜精品一区二区| 乱一区二区av| 久久成人国产| 福利精品一区| 一区二区电影在线观看| jizzjizz中国精品麻豆| 久久午夜视频| 精品视频91| 亚洲欧美日韩精品一区二区| 国产精品亚洲人成在99www| 日韩精品五月天| 亚洲深夜视频| 日韩视频1区| 久久人人88| 久久国产精品免费精品3p| 欧美日韩中文一区二区| 国产一精品一av一免费爽爽| 免费视频国产一区| 你懂的国产精品永久在线| 国产精品三上| 97精品在线| 日韩福利视频导航| 欧美精品一区二区三区精品| 免费在线播放第一区高清av| 久久成人一区| 免费在线小视频| 国产精品密蕾丝视频下载| 亚洲欧美不卡| 99久久精品网| 国产一区二区三区四区五区| 婷婷成人av| 日韩午夜在线| 国产精品原创| 国产欧美综合一区二区三区| 国产日韩综合| 日韩毛片视频| 欧美91在线| 日韩黄色在线观看| 日韩中文字幕1| 欧洲毛片在线视频免费观看| 国产精品久久久久久久久久白浆| 久久香蕉精品| 不卡在线一区| 免费污视频在线一区| 国产精品v日韩精品v欧美精品网站| 美女久久一区| 亚洲精品va| 色88888久久久久久影院| 免费在线亚洲欧美| 日本色综合中文字幕| 亚洲专区一区| 视频一区中文| 桃色一区二区| 亚洲午夜天堂| 久久精品三级| 国产精品亚洲综合久久| 日本91福利区| 亚欧成人精品| 一区二区日韩免费看| 日韩一级精品| 激情91久久| 蜜桃tv一区二区三区| 婷婷成人在线| 成人精品中文字幕| 91看片一区| 午夜精品成人av| 久久久精品午夜少妇| 精品丝袜在线| 91精品国产成人观看| 日韩视频网站在线观看| 91亚洲国产高清| 国产在线看片免费视频在线观看| 精品国产美女a久久9999| 美腿丝袜亚洲一区| 麻豆91精品视频| 国产在线一区不卡| 国产一区二区三区成人欧美日韩在线观看| 国产激情久久| 国产在线不卡一区二区三区| 日韩88av| 亚洲日本网址| 91精品一区二区三区综合在线爱| 久久天堂精品| 91久久中文| 99在线精品免费视频九九视| 欧美精选一区二区三区| 国内精品99| 午夜亚洲福利在线老司机| 久久成人精品| 911精品国产| 精品视频一区二区三区在线观看| 成人一区而且| 亚洲香蕉网站| 亚洲一区日本| 日韩激情综合| 你懂的亚洲视频| 日本а中文在线天堂| 欧美午夜精品一区二区三区电影| 伊人影院久久| 天堂久久av| 欧美国产视频| 日韩国产欧美| 91久久久久| 91麻豆精品激情在线观看最新| 国产精品日本一区二区三区在线| 成人国产精品| 樱桃成人精品视频在线播放| 天堂av一区| 久久99免费视频| 久久国产中文字幕| 免费人成在线不卡| 国产精品毛片aⅴ一区二区三区| 色综合五月天| 怡红院精品视频在线观看极品| 日本欧美一区二区| 精品视频高潮| 亚洲欧洲午夜| 国产伦理久久久久久妇女| 日韩欧美网址| 综合干狼人综合首页| 另类综合日韩欧美亚洲| 欧美日韩第一| 久久国产免费看| 香蕉人人精品| 国产视频一区二区在线播放| 日韩欧美看国产| 亚洲专区视频| 国产一区二区三区亚洲| 先锋影音国产一区| 久久久免费人体| 国产精品7m凸凹视频分类| 日韩亚洲精品在线观看| 水蜜桃精品av一区二区| 视频在线观看一区二区三区| 精品国产麻豆| 免费人成网站在线观看欧美高清| 久久亚洲道色| 久久亚洲一区| 久久毛片亚洲| 午夜电影一区| 日本在线高清| 奇米狠狠一区二区三区| 久久久久蜜桃| 国产精品xxxav免费视频| 国产一区二区精品| 麻豆精品在线播放| 亚洲欧美网站| 麻豆mv在线观看| 日韩av电影一区| 五月综合激情| 成人精品视频| 国产欧美自拍| 首页欧美精品中文字幕| 日韩成人三级| 国产精品手机在线播放|