學好ORM框架SQLAlchemy面試必問

2020-09-27 程式設計師小鵬

首先我們先來了解一下SQLAlchemy

SQLAlchemy是Python程式語言下的一款ORM框架,該框架建立在資料庫API之上,使用關係對象映射進行資料庫操作,簡言之便是:將對象轉換成SQL,然後使用數據API執行SQL並獲取執行結果。

第一步: 安裝SQLAlchemy

pip3 install sqlalchemy

第二步:SQLAlchemy的構架和流程 圖下:



1、使用者通過ORM對象提交命令

2、將命令交給SQLAlchemy Core(Schema/Types SQL Expression Language)轉換成SQL

3,使用Engine/ConnectionPooling/Dialect 進行資料庫操作

3.1,匹配使用者事先配置好的egine

3.2,egine從連接池中取出一個連結

3.3,基於該連結通過Dialect調用DB API,將SQL轉交給它去執行

通過上面的流程分析,我們分為兩個階段

第一個階段(流程1-2):將SQLAlchemy的對象換成可執行的sql語句

第二個階段(流程3):將sql語句交給資料庫執行

如果我們不用SQLAlchemy的轉換然後自己去寫sql語句的話我們直接寫完第一個階段就可以開始執行了,如下所示:

from sqlalchemy import create_engine 需要事先安裝好pymysql2 創建引擎egine=create_engine(&39;) egine.execute(&39;)39;insert into t1 values(%s,%s);&34;egon1&34;egon2&34;egon3&按位置傳值39;insert into t1 values(%(id)s,%(name)s);&39;egon4&按關鍵字傳值 print(cur.lastrowid)39;select * from t1&獲取一行cur.fetchmany(2) 獲取所有行

第三步:DB API

SQLAlchemy本身無法操作資料庫,其必須以來pymsql等第三方插件,Dialect用於和數據API進行交流,根據配置文件的不同調用不同的資料庫API,從而實現對資料庫的操作,如下所示:

2、pymysql    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]4、cx_Oracle    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

更多示例:http://docs.sqlalchemy.org/en/latest/dialects/index.html

創建表

在ORM中:

對象==>表中的一行記錄39;mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8&39;business&39;service&39;business.id&39;uix_ip_port&39;ix_id_sname&39;role&39;business.id&39;users&39;users2role&39;users.id&39;role.id&39;uix_uid_rid&39;__main__&註:設置外鍵的另一種方式 ForeignKeyConstraint([&39;], [&39;])

增刪改查

表結構

from sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column,Integer,String,ForeignKeyfrom sqlalchemy.orm import sessionmakeregine=create_engine(&39;,max_overflow=5)Base=declarative_base()39;dep&39;emp&39;dep.id&39;銷售&按關鍵字傳參,無需指定id,因其是自增長的session.add(row_obj)session.add_all([    Dep(dname=&39;),    Dep(dname=&39;),    Dep(dname=&39;),])session.commit()

刪除:

session.query(Dep).filter(Dep.id > 3).delete()session.commit()

修改:

session.query(Dep).filter(Dep.id > 0).update({&39;:&39;})session.query(Dep).filter(Dep.id>0).update({&39;:Dep.dname+&39;},synchronize_session=False)session.query(Dep).filter(Dep.id>0).update({&39;:Dep.id*100},synchronize_session=&39;)session.commit()

查詢所有:

res=session.query(Dep).all() for row in res:print(row.dname)res=session.query(Dep.dname).first()print(res) 39;哇哈哈_SB&逗號分隔,默認為andprint([(row.id,row.dname) for row in res])

其他的一些相關查詢

準備表和數據

from sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column,Integer,String,ForeignKeyfrom sqlalchemy.orm import sessionmakeregine=create_engine(&39;,max_overflow=5)Base=declarative_base()39;dep&39;emp&39;dep.id&39;技術&39;銷售&39;運營&39;人事&39;林海峰&39;李傑&39;武配齊&39;元昊&39;李鋼彈&39;張二丫&39;李坦克&39;王大炮&39;牛榴彈&39;林海峰&filter_by只能傳參數:什麼等於什麼res=sql.all() 39;林海峰&filter內傳的是表達式,逗號分隔,默認為and,res=session.query(Emp).filter(Emp.id.between(1,3),Emp.ename == &39;).all()res=session.query(Emp).filter(Emp.id.in_([1,3,99,101]),Emp.ename == &39;).all()res=session.query(Emp).filter(~Emp.id.in_([1,3,99,101]),Emp.ename == &39;) 39;林海峰&39;功夫熊貓&39;功夫熊貓&39;&39;%海_%&39;%海_%&select * from emp,dep; for row in res:     dep_tb=row[1]內連接res=session.query(Emp).join(Dep)但是上述查詢的結果均為Emp表的欄位,這樣鍊表還有毛線意義,於是我們修改為res=session.query(Emp.id,Emp.ename,Emp.dep_id,Dep.dname).join(Dep).all()右連接:同左連接,只是把兩個表的位置換一下

組合:

q1=session.query(Emp.id,Emp.ename).filter(Emp.id > 0,Emp.id < 5)q2=session.query(Emp.id,Emp.ename).filter(    or_(        Emp.ename.like(&39;),        Emp.ename.like(&39;),   ))res1=q1.union(q2) 組合,不去重print([i.ename for i in q1.all()]) 39;林海峰&39;李傑&39;武配齊&39;元昊&[&39;, &39;]print([i.ename for i in res1.all()]) 39;林海峰&39;李傑&39;武配齊&39;元昊&[&39;, &39;, &39;, &39;, &39;, &39;]

現在是子查詢:有三種形式的子查詢,子查詢的sql必須用括號包起來

原生SQL:ORM:res=session.query(    session.query(Emp).filter(Emp.id > 8).subquery()).all()查出銷售部門的員工姓名 select ename from emp where dep_id in (select id from dep where dname=&39;);39;銷售&傳的是參數    39;銷售&傳的是表達式)).all()原生SQL:ORM:sub_sql=session.query(Dep.dname).filter(Dep.id==Emp.dep_id) as_scalar的功能就是把上面的sub_sql加上了括號res=session.query(Emp.ename,sub_sql.as_scalar()).all()

正查和反查 表修改:

from sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column,Integer,String,ForeignKeyfrom sqlalchemy.orm import sessionmaker,relationshipegine=create_engine(&39;,max_overflow=5)Base=declarative_base()class Dep(Base):    __tablename__=&39;    id=Column(Integer,primary_key=True,autoincrement=True)    dname=Column(String(64),nullable=False,index=True)class Emp(Base):    __tablename__=&39;    id=Column(Integer,primary_key=True,autoincrement=True)    ename=Column(String(32),nullable=False,index=True)    dep_id=Column(Integer,ForeignKey(&39;))​    1:Dep是類名    3:depart用於Emp表查詢Dep表(正向查詢),而xxoo用於Dep表查詢Emp表(反向查詢),    depart=relationship(&39;,backref=&39;)def init_db():    Base.metadata.create_all(egine)def drop_db():    Base.metadata.drop_all(egine)​drop_db()init_db()Session=sessionmaker(bind=egine)session=Session()39;技術&39;銷售&39;運營&39;人事&39;林海峰&39;李傑&39;武配齊&39;元昊&39;李鋼彈&39;張二丫&39;李坦克&39;王大炮&39;牛榴彈& 示例:查詢員工名與其部門名res=session.query(Emp.ename,Dep.dname).join(Dep) 等同於print(row.ename,row.dname)

基於relationship的正查、反查

查詢員工名與其部門名(正向查)res=session.query(Emp)for row in res:    print(row.ename,row.id,row.depart.dname) print(row.dname,row.xxoo)    print(row.dname,[r.ename for r in row.xxoo])


以上就是小編今天帶來的內容 小編本身就是一名python開發工程師,我自己花了三天時間整理了一套python學習教程,從最基礎的python腳本到web開發,爬蟲,數據分析,數據可視化,機器學習,等,這些資料有想要的小夥伴可關注小編,並在後臺私信小編:「 01 」 即可領取

相關焦點

  • SQLAlchemy 1.3.8 發布,Python ORM 框架
    SQLAlchemy 是一個 Python 的 SQL 工具包以及資料庫對象映射(ORM)框架。它包含整套企業級持久化模式,專門用於高效和高性能的資料庫訪問。新版本包含對新的 psycopg2 「執行值」性能的修復,以適應由編譯器掛鈎修改的 INSERT 語句。
  • SQLAlchemy 1.2.7 發布,Python 的 ORM 框架
    SQLAlchemy 1.2.7 已發布,引入了一系列針對 Core 和 ORM 的修復:[orm] [bug] Fixed regression
  • SQLAlchemy 1.3.12 發布,Python ORM 框架
    SQLAlchemy 是一個 Python 的 SQL 工具包以及資料庫對象映射(ORM)框架。它包含整套企業級持久化模式,專門用於高效和高性能的資料庫訪問。更新內容如下:orm 修復了涉及 lazy="raise" 策略的問題,在該策略中,對象的 ORM 刪除將引發配置了 lazy="raise" 的簡單 「use-get」 樣式多對一關係。
  • Python資料庫ORM工具sqlalchemy的學習筆記
    ,並且支持強大的ORM的功能,下面是基本使用 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker  # 資料庫連接字符串 DB_CONNECT_STRING = 'sqlite:////Users/zhengxiankai/Desktop/Document/db.sqlite'  #
  • SQLAlchemy基礎入門
    精華推薦:重磅發布 - 自動化框架基礎指南pdf什麼是SQLAlchemySQLAlchemy是Python SQL工具包和對象關係映射器,它為應用程式開發人員提供了SQL的全部功能和靈活性。它提供了一套完整的眾所周知的企業級持久性模式,專為高效和高性能的資料庫訪問而設計,適用於一種簡單的python域語言。
  • SQLAlchemy 1.1.10 發布,Python 的 ORM 框架
    SQLAlchemy 是一個Python 的SQL 工具包以及資料庫對象映射框架。它包含整套企業級持久化模式,專門為高效和高性能的資料庫訪問。oraclemisc下載地址:https://www.sqlalchemy.org/download.html>>>【全民狂歡,評論有禮】5月15日-31日評論每日更新的「新聞資訊和軟體更新資訊」,評論點讚數超過 20 的可登上每周更新的「源資訊」和「軟體周刊」兩大欄目,點讚數超過 50 的還將獲得
  • 為什麼要使用新一代ORM框架sqltoy-orm
    sqltoy-orm是基於java的最綜合最理想的orm框架,主要特點:1、是真正超越hibernate/jpa、jdbcTemplate、mybatis/plus、jooq之和的orm框架,規避了上述框架的走極端的缺點,發揮他們的優勢,即:普通的crud就應該類似於hibernate
  • Java人員面試必問什麼技術 怎麼應對Spring框架
    Java人員面試必問什麼技術?怎麼應對Spring框架?作為一名高級Java工程師,不僅要具備紮實的理論功底,還要有較多的項目經驗,要對市面上的主流技術有一個大致的了解。框架能夠提升程序開發效率,也是高薪Java工程師面試必問的技術,下面就給大家分享一下常見的Spring框架面試題。
  • Python ORM框架SQLAlchemy1.3.20發布
    SQLAlchemy 是一個 Python 的 SQL 工具包以及資料庫對象映射(ORM)框架。它包含整套企業級持久化模式,專門用於高效和高性能的資料庫訪問。修復了在 sqlalchemy.exc 模塊中未使用 SQLAlchemy 的標準後期導入系統的功能級別的導入。
  • Python通過SQLAlchemy-ORM訪問操作MySQL資料庫
    方式訪問操作MySQL資料庫的主要實現要點如下:4.1 導入SQLAlchemy在Python中要使用SQLAlchemy,則需要導入sqlalchemy模塊:import sqlalchemy在實際編寫代碼時,為簡化代碼,一般不直接使用import sqlalchemy,而是使用sqlalchemy模塊中直接用到的相關部分
  • 靈活使用 SQLAlchemy 中的 ORM 查詢
    Book.price > 40) \ .all()print([dict(zip(v.keys(), v)) for v in books])結果[{&39;: 9, &39;: &39;, &39;: &39;}]統計各個分類的圖書的數量from sqlalchemy
  • Ebean ORM 7.12.2 發布,Java 持久層 ORM 框架
    Ebean ORM 7.12.2 發布了,Ebean ORM 是Java/Kotlin的持久層ORM框架,在JVM上快速簡單的數據訪問。
  • 我為什麼堅持寫sqltoy-orm開源框架
    3、大型或基礎核心型開源框架而sqltoy-orm則目標是代替hibernate和mybatis,屬於基礎核心框架,一旦使用對項目影響深遠,甚至說影響項目的整個生命周期!所以說這類開源是需要極其慎重的!
  • Pony - 最智能的 Python ORM 框架
    Pony,就是一個具有高抽象程度的 Python 語言的 ORM 框架,其優雅的語法,甚至支持使用 Python 中的列表推導式進行資料庫查詢。Pony ORM庫簡介Pony,是 ponyorm在 Github 上開源的 Python ORM 框架,項目位於 https://github.com/ponyorm/pony,目前版本為 0.7.13。
  • spring-data-ebean v1.3.0 發布,超強大的 ORM 框架
    超簡單、超強大的 ORM 框架,OQL、SQL、ES 多查詢引擎,超越 JPA、Hibernate、Mybatis。
  • sagacity-sqltoy 4.17.8 發布,Java ORM 框架
    1、支持緩存翻譯未匹配模板設置為空白或空字符串: uncached-template=""(之前空白當成無效設置,依舊返回xxkey 未匹配)<translate cache="dictCache" cache-type="POST_TYPE" columns="POST_TYPE" uncached-template="" />sqltoy-orm
  • 電商運營面試,老闆必問的幾個問題
    電商運營面試,老闆必問的幾個問題,電商運營面試,老闆必問的幾個問題,做好準備有助於你面試成功,拿到較高工資哦!2.新店如何開始運營這個問題主要是問你思路和方法。不用回答得過於具體,可以這麼說:第一,我需要了解清楚咱們公司的產品質量、性能,在競爭對手比有什麼優勢。第二,我們產品的客戶,最關心什麼?他們最在乎或希望產品給他們帶來什麼價值?
  • Python 框架 SQLAlchemy 1.3.20 發布
    SQLAlchemy 是一個 Python 的 SQL 工具包以及資料庫對象映射(ORM)框架。它包含整套企業級持久化模式,專門用於高效和高性能的資料庫訪問。本次更新內容如下:ORM 相關ArgumentError 如果將的目標參數 Query.join() 設置為未映射的對象,則會引發一個更詳細的信息。
  • 日本留學-學部面試必問到的七大問題
    大輝醬綜合往年數據及今年情況,現為大家帶來學部面試教授必問的七大問題總結,送給需要準備校內考面試的你!1大學の志望理由面試準備重點中的重點,百分百會問到的問題。雖然在出願時也要提交志望理由書,但面試中的志望理由提問可不是把你寫的內容原封不動背下來那麼簡單。志望理由需要涵蓋的內容:◆想要研究什麼。
  • 面試必問-GET和POST的區別
    一般在面試初級和中級開發工程師的時候,這個問題是必問的問題,高級工程師問到的概率是特別大,但是也容易問到。下面我就給大家講講如何完美回答這個問題。這是很多小夥伴們回答的時候都回答不上的點,同時也是面試官想要的答案之一,希望小夥伴們記住這一點。