日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python orm框架sqlalchemy_python ORM框架:SqlAlchemy

發(fā)布時(shí)間:2023/12/3 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python orm框架sqlalchemy_python ORM框架:SqlAlchemy 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ORM,對(duì)象關(guān)系映射,即Object Relational Mapping的簡(jiǎn)稱,通過(guò)ORM框架將編程語(yǔ)言中的對(duì)象模型與數(shù)據(jù)庫(kù)的關(guān)系模型建立映射關(guān)系,這樣做的目的:簡(jiǎn)化sql語(yǔ)言操作數(shù)據(jù)庫(kù)的繁瑣過(guò)程(原生sql的編寫及拼接等),轉(zhuǎn)而直接使用對(duì)象模型來(lái)操作數(shù)據(jù)庫(kù)做替代

第一部分

SqlAlchemy本身無(wú)法直接操作數(shù)據(jù)庫(kù),它是建立在第三方數(shù)據(jù)庫(kù)API(如python 中的pymysql庫(kù))之上,應(yīng)用程序調(diào)用對(duì)象模型進(jìn)行增刪改查等操作時(shí),將對(duì)象轉(zhuǎn)化成sql語(yǔ)句,然后再通過(guò)API調(diào)用執(zhí)行已經(jīng)轉(zhuǎn)換好的sql語(yǔ)句

安裝

pip install sqlalchemy

pip install pymysql #這里筆者使用的數(shù)據(jù)API是pymysql

應(yīng)用

- 配置及創(chuàng)建數(shù)據(jù)庫(kù)引擎

SqlAlchemy 支持間接調(diào)用多種數(shù)據(jù)庫(kù)API,根據(jù)不能的配置文件調(diào)用不同的數(shù)據(jù)庫(kù)API

#常見(jiàn)配置文件:即database url,創(chuàng)建數(shù)據(jù)庫(kù)引擎需要

MySQL-Python:mysql+mysqldb://:@[:]/

pymysql:mysql+pymysql://:@/[?]

MySQL-Connector:mysql+mysqlconnector://:@[:]/

cx_Oracle:oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

- 創(chuàng)建數(shù)據(jù)庫(kù)引擎

* 注意 *:帶上charset=utf8參數(shù),防止中文亂碼

#初始化數(shù)據(jù)庫(kù)連接

from sqlalchemy import create_engine

url="mysql+pymysql://[賬號(hào)]:[密碼]@[主機(jī)]:[端口]/[數(shù)據(jù)庫(kù)]?charset=utf8" #這里筆者使用的mysql數(shù)據(jù)庫(kù),pymysql API與數(shù)據(jù)庫(kù)交互,添加的charset可防止中文亂碼

engine=create_engine(url,echo=False,encoding="utf-8") #url為配置文件,echo調(diào)試參數(shù),值為為true打印整個(gè)sql執(zhí)行過(guò)程

- 創(chuàng)建會(huì)話(session)

通過(guò)sessionmaker工廠方法,我們得到一個(gè)類,默認(rèn)返回Session類,也可以自定義Session類

方法:

sessionmaker( bind=None, class_=Session, autoflush=True,autocommit=False,expire_on_commit=True,info=None, **kw)

#示例1:直接調(diào)用sessionmaker

from sqlalchemy.orm import sessionmaker

SessionClass=sessionmaker(bind=engine)#利用工廠模式獲取SessionClass

session_obj=SessionClass() #創(chuàng)建session對(duì)象,此時(shí)已綁定數(shù)據(jù)庫(kù)引擎,但是未關(guān)聯(lián)任何的對(duì)象模型

#示例1:使用scoped_session

from sqlalchemy.orm import scoped_session

SessionClass=scoped_session(sessionmaker(bind=engine))#利用工廠模式獲取SessionClass

session_obj=SessionClass() #創(chuàng)建session對(duì)象,此時(shí)已綁定數(shù)據(jù)庫(kù)引擎,但是未關(guān)聯(lián)任何的對(duì)象模型

scoped_session VS Session

Session:多次創(chuàng)建的Session對(duì)象是不同的

scoped_session:首先通過(guò)sessionmaker工廠創(chuàng)建Session對(duì)象,然后對(duì)Session對(duì)象進(jìn)行相應(yīng)的管理(先在Registry中找之前是否創(chuàng)建過(guò)Session,若沒(méi)有,則創(chuàng)建并注冊(cè),有,則直接返回),這樣的目的:同一個(gè)線程維護(hù)一個(gè)session對(duì)象,保證了線程的安全性

- 與數(shù)據(jù)庫(kù)交互

常用操作:與sql語(yǔ)言一致,主要是增刪改查,接下來(lái)就簡(jiǎn)要概述這4大類

******* 增 *******

session.add(object) #在數(shù)據(jù)庫(kù)中增加一個(gè)對(duì)象實(shí)例

session.add_all([object]) #在數(shù)據(jù)庫(kù)中增加多個(gè)對(duì)象實(shí)例,參數(shù)為列表形式

session.commit() #提交,否則未入口

******* 查 *******

#備注:以下均已object代表對(duì)象模型,object.prop代表對(duì)象object的prop屬性

session.query(object) #查詢object對(duì)應(yīng)的關(guān)系表,相當(dāng)于select * from tables

session.query(object).first() #查詢結(jié)果取第一條,沒(méi)有返回none

session.query(object).filter(object.prop) #條件查詢,filter相當(dāng)于where

session.query(object).order_by(object.prop) #排序,默認(rèn)升序,降序用desc

session.query(object).order_by(object.prop.desc()).limit(10) #降序,及限制10條

session.query(object.prop.label("別名")).filter(object.prop.like("%同同mony")) #模糊查詢及給字段取別名

#使用聚合函數(shù),sum、count等

from sqlalchemy import func

session.query(func.sum(object.prop).label("別名")

******* 改 *******

session.query(object).filter(object.prop>20).update({"prop1": 'values'})#批量更新,若沒(méi)有過(guò)濾條件,這更新表中所有記錄

myuser = Session.query(object).filter(object.prop>20).first()

object.prop2= 'value2' #單條更新,可直接修改對(duì)象

session.commit()

******* 刪 *******

res = session.query(object).filter(object.prop>20).delete()

session.commit()

第二部分

掌握了基本概念和使用,為了更高效、更快捷將關(guān)系表轉(zhuǎn)化成對(duì)象,不得不提sqlacodegen工具

a.安裝

pip install sqlacodegen

b.使用

sqlacodegen url [opts]

這里的url就是sqlalchemy中create_engine使用的參數(shù),但是當(dāng)賬號(hào)密碼含有特殊字符時(shí),同樣的url,在sqlacodegen命令中會(huì)報(bào)錯(cuò),識(shí)別不出賬號(hào)、密碼、端口等信息,此時(shí)可通過(guò)給賬號(hào)和密碼加引號(hào)解決

opts:

--tables TABLES 指定表,默認(rèn)將所有表轉(zhuǎn)化成對(duì)象

--noindexes 忽略索引

--noviews 忽略視圖

--noclasses 不生成類,僅生成表

--outfile OUTFILE 輸出文件

示例:

sqlacodegen --noviews --noconstraints --noclasses --noindexes --outfile 對(duì)應(yīng)py文件路徑 url【同create engine處使用的】

注意 :當(dāng)賬號(hào)和密碼包含特殊字符時(shí),需要用引號(hào),否則自動(dòng)識(shí)別不出賬號(hào)、密碼、端口等信息

示例1:

#不使用 `--noclasses`導(dǎo)出的對(duì)象

from sqlalchemy import BIGINT, Column, DateTime, Float, String, text

from sqlalchemy.dialects.mysql.types import TINYINT

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

metadata = Base.metadata

class TDeviceActivate(Base):

__tablename__ = 't_device_activate'

id = Column(BIGINT(10), nullable=False)

user_id = Column(BIGINT(10), nullable=False)

device_id = Column(String(32), primary_key=True, nullable=False)

mac = Column(String(30))

uuid = Column(String(32))

firmware_type = Column(String(16), primary_key=True, nullable=False)

activate_time = Column(DateTime, nullable=False)

create_date = Column(DateTime, nullable=False)

ip_address = Column(String(50))

longitude = Column(Float(10))

latitude = Column(Float(10))

expires_time = Column(DateTime)

type = Column(TINYINT(10), server_default=text("'1'"))

示例2

#使用 `--noclasses`參數(shù)導(dǎo)出的對(duì)象

from sqlalchemy import BIGINT, Column, DateTime, Float, MetaData, String, Table, text

from sqlalchemy.dialects.mysql.types import TINYINT

metadata = MetaData()

t_t_device_activate = Table(

't_device_activate', metadata,

Column('id', BIGINT(10), nullable=False),

Column('user_id', BIGINT(10), nullable=False),

Column('device_id', String(32), primary_key=True, nullable=False),

Column('mac', String(30)),

Column('uuid', String(32)),

Column('firmware_type', String(16), primary_key=True, nullable=False),

Column('activate_time', DateTime, nullable=False),

Column('create_date', DateTime, nullable=False),

Column('ip_address', String(50)),

Column('longitude', Float(10)),

Column('latitude', Float(10)),

Column('expires_time', DateTime),

Column('type', TINYINT(10), server_default=text("'1'"))

)

總結(jié)

在UI回歸測(cè)試腳本中,通常涉及到與數(shù)據(jù)庫(kù)打交道,開(kāi)始時(shí)候主要使用pymysql API 與數(shù)據(jù)交互,但是隨著使用頻率的增加,直接書寫sql變得繁瑣,便嘗試使用orm的方式

總結(jié)

以上是生活随笔為你收集整理的python orm框架sqlalchemy_python ORM框架:SqlAlchemy的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。