SQLAlchemy是Python程式語言下的一款ORM框架,該框架建立在資料庫API之上,使用關係對象映射進行資料庫操作,簡言之便是:將對象轉換成SQL,然後使用數據API執行SQL並獲取執行結果。
pip3 install 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) 獲取所有行
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 」 即可領取