成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

Python SQLAlchemy庫的使用方法

瀏覽:2日期: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 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日本vs亚洲vs韩国一区三区二区| 国产精品乱码人人做人人爱| 亚洲一区日韩在线| 欧美亚洲尤物久久| 国产亲近乱来精品视频| 亚洲一区二区三区在线看| 精品亚洲欧美一区| 亚洲午夜久久久久久尤物| 在线视频欧美精品| 亚洲精品在线三区| 亚洲制服欧美中文字幕中文字幕| 国语精品一区| 91精品国产美女浴室洗澡无遮挡| 亚洲免费av观看| 国产超碰在线一区| 国产精品推荐精品| 久久中文字幕电影| 美女视频第一区二区三区免费观看网站 | 精品国免费一区二区三区| 成人av网站大全| 在线精品亚洲一区二区不卡| 日韩国产高清影视| 激情五月***国产精品| 国产精品天干天干在观线| 亚洲视频狠狠| 亚洲一区在线视频| 欧美性生交片4| 国产激情一区二区三区四区 | 日本欧美肥老太交大片| 欧美日韩一级视频| 一区二区三区四区高清精品免费观看| 成人午夜在线播放| 91国产视频在线观看| 日韩一区有码在线| 成人综合在线观看| 久久九九全国免费| 国产传媒一区在线| 久久久国产精品午夜一区ai换脸| 国产成人在线视频网址| 久久综合国产精品| 亚洲国产日本| 欧美韩日一区二区三区四区| 国产成人亚洲精品狼色在线| 久久综合色之久久综合| 亚洲成人中文| 欧美国产亚洲另类动漫| 亚洲大胆女人| 日本欧美大码aⅴ在线播放| 日韩一级二级三级| 韩国一区二区在线观看| 国产精品视频福利| 日本欧美在线观看| 精品成人在线观看| 99精品99| 亚洲三级电影网站| 狠狠色综合网| 日日摸夜夜添夜夜添精品视频| 在线亚洲成人| 亚洲同性gay激情无套| 久久久久综合| 午夜不卡av在线| 国产欧美日韩| 久久爱另类一区二区小说| 欧美性猛交一区二区三区精品| 国产麻豆精品theporn| 欧美日韩小视频| 91麻豆精东视频| 久久久电影一区二区三区| 亚洲精品一区二区三区樱花 | 国产日韩精品久久久| 亚洲一区二区精品在线| 国产精品一区二区黑丝| 91精品国产综合久久精品| 午夜精品美女久久久久av福利| 精品福利在线导航| 亚洲精品系列| 国产做a爰片久久毛片| 中文字幕在线不卡一区二区三区| 欧美三级韩国三级日本一级| 欧美日韩天天操| 日韩伦理免费电影| 欧美日韩国产一级二级| 国产精品一区二区三区乱码| 国产精品免费久久久久| 欧美影院午夜播放| 黑人一区二区| 国产精一区二区三区| 亚洲精品视频在线看| 国产亚洲欧美一区二区三区| 91精品国产综合久久蜜臀| 日本一区二区三级电影在线观看| 在线不卡亚洲| 狠狠色丁香久久婷婷综合丁香| 亚洲国产高清在线观看视频| 欧美日韩一区二区在线观看 | av在线一区二区| 日韩精品一区二区在线观看| 福利91精品一区二区三区| 亚洲精品免费一二三区| 日韩欧美国产麻豆| 久久久久久精| 欧美三区不卡| 国产高清精品网站| 亚洲成人黄色影院| 欧美自拍偷拍午夜视频| 欧美国产三区| 亚洲自拍偷拍图区| 久久奇米777| 欧美三级视频在线播放| 亚洲高清资源| 91丨九色porny丨蝌蚪| 久久99久久99小草精品免视看| 亚洲综合男人的天堂| 久久精品免费在线观看| 欧美日韩国产综合视频在线观看| 国产精品一区亚洲| 午夜欧美视频| 成人免费毛片app| 精品亚洲aⅴ乱码一区二区三区| 夜色激情一区二区| 日本一区二区免费在线观看视频| 欧美日韩国产bt| 久久大逼视频| 国产一区二区视频在线播放| 亚洲韩国一区二区三区| 欧美日韩一区二区不卡| 国产欧美一区二区色老头| 91麻豆国产福利在线观看| 国产成人自拍在线| 久久99在线观看| 日本中文字幕不卡| 亚洲国产视频a| 日韩久久一区二区| 国产精品少妇自拍| 久久综合一区二区| 日韩一区二区三区三四区视频在线观看| 色综合久久久久综合| 国产东北露脸精品视频| 日韩av二区在线播放| 亚洲国产综合人成综合网站| 中文字幕一区二区三区不卡 | 精品视频在线看| 性伦欧美刺激片在线观看| 国产高清亚洲一区| 青青草精品视频| 婷婷中文字幕一区三区| 伊人开心综合网| 国产精品久线观看视频| 欧洲在线/亚洲| 免费看的黄色欧美网站| 亚洲最黄网站| 一区二区视频欧美| 激情丁香综合| 在线观看一区视频| 一区二区视频在线观看| 激情视频一区| 在线观看欧美一区| 日韩一级欧洲| 国产欧美一区二区三区国产幕精品| 激情一区二区三区| 亚洲无吗在线| 亚洲人成人一区二区三区| 午夜精品视频| 欧美日韩一区在线观看视频| 欧美天天视频| 激情成人综合| 99亚洲一区二区| 国产精品日韩一区二区| 亚洲欧美日韩国产综合精品二区| 色综合色综合色综合| 日韩电影一区二区三区四区| 亚洲一区二区偷拍精品| 亚洲国产一区视频| 亚洲成a人片在线观看中文| 香港成人在线视频| 日韩黄色一级片| 麻豆精品视频在线观看免费| 麻豆精品在线观看| 国产一区二区三区免费看| 国产精品乡下勾搭老头1| 懂色av噜噜一区二区三区av| 粉嫩欧美一区二区三区高清影视| 不卡视频免费播放| 欧美激情麻豆| 亚洲美女少妇无套啪啪呻吟| 国产精品一区二区三区观看| 久久一区视频| 欧美欧美欧美欧美| 欧美成人性福生活免费看| 久久久夜精品| 在线视频国产一区| 欧美男同性恋视频网站| 欧美日本国产一区| 日韩欧美国产三级| 欧美高清在线一区| 一区二区三区高清在线| 日韩高清不卡在线| 国产寡妇亲子伦一区二区| 欧美一区二区三区四区在线观看地址| 在线欧美视频|