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

歡迎訪問 生活随笔!

生活随笔

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

php

alchemy php,Python下SQLAlchemy的简单介绍

發(fā)布時(shí)間:2024/4/13 php 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 alchemy php,Python下SQLAlchemy的简单介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于php協(xié)成實(shí)現(xiàn)的詳解(附代碼),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對(duì)象關(guān)系映射(ORM)工具,SQLAlchemy使用MIT許可證發(fā)行。它采用簡(jiǎn)單的Python語音,為高效和高性能的數(shù)據(jù)庫(kù)訪問設(shè)計(jì),實(shí)現(xiàn)了完整的企業(yè)級(jí)持久模型。SQLAlchemy非常關(guān)注數(shù)據(jù)庫(kù)的量級(jí)和性能。

本節(jié)通過一套例子分析SQLAlchemy的使用方法。

使用SQLAlchemy至少需要3部分代碼,它們分別是定義表、定義數(shù)據(jù)庫(kù)連接、進(jìn)行增、刪、改、查等邏輯操作。

定義表的實(shí)例:from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column,Integer,String

Base=declarative_base()

class Accout(Base):

__tablename__=u'accout'

id=Column(Integer,primary_key=True)

user_namr=Column(String(50),nullable=False)

password=Column(String(200),nullable=False)

title=Column(String(50))

salary=Column(Integer)

def is_active(self):

#假設(shè)所有

return True

def get_id(self):

#返回賬號(hào)ID,用方法返回屬性值提高了表的封裝性。

return self.id

def is_authenticated(self):

#假設(shè)已經(jīng)通過驗(yàn)證

return True

def is_anonymous(self):

#具有登陸名和密碼的賬號(hào)不是匿名用戶

return False

解析定義表的代碼如下:SQLAlchemy表之前必須必須引入sqlalchemy.ext.declarative_base,并定義一個(gè)它的實(shí)例Base。所有表必須繼承自Base。本例中定義了一個(gè)賬戶表類Account。

通過__tablename__屬性定義了表在數(shù)據(jù)庫(kù)中實(shí)際的名稱account。

引入sqlalchemy包中的Column、Integer、String類型,因?yàn)樾枰盟鼈兌x表中的列。本例在Account表中定義了5個(gè)列,分別是整型id和salary,以及字符串類型的user_name、password、title。

在定義列時(shí)可以通過給Column傳送參數(shù)定義約束。本例中通過primary_key參數(shù)將id列定義主鍵,通過nullable參數(shù)將user__name和password定義非空。

在表中還可以自定義其他函數(shù)。本例中定義了用戶驗(yàn)證時(shí)常用的幾個(gè)函數(shù):is__activite()、get__id()、is__authenticate()和is_anonymous()。

定義數(shù)據(jù)庫(kù)連接的示例代碼如下:from sqlalchemy import create_engine

from sqlalchemy.orm import scoped_session,sessionmaker

from contextlib import contextmanager

db_connect_string='mysql://v_user:v_pase@localhost:3306/test_database?charset=utf8'

ssl_args={

'ssl':{

'cert':'/home/ssl/client-cert.pem',

'key':'/home/shouse/ssl/client-key.pem',

'ca':'/home/shouse/ssl/ca-cert.pem'

}

}

engine=create_engine(db_connect_string,connect_args=ssl_args)

SessionType=scoped_session(sessionmaker(bind=engine,expire_on_commit=False))

def GetSession():

return SessionType()

@contextmanager

def session_scope():

session=GetSession()

try:

yield session

session.commit()

except:

session.rollback()

raise

finally:

session.close()

解析此連接數(shù)據(jù)部分的代碼如下:引入數(shù)據(jù)庫(kù)和會(huì)話引擎:sqlalchemy.create_engine、sqlalchemy.orm.scoped_session、sqlalchemy.orm.sessionmaker。

定義連接數(shù)據(jù)庫(kù)需要用到的數(shù)據(jù)庫(kù)字符串。本例連接MySQL數(shù)據(jù)庫(kù),字符串格式為[databse_type]://[user_name]:[password]@[domain]:[port]/[database]?[parameters]。本例中除了必須的連接信息,還傳入了charset參數(shù),指定用utf-8編碼方式解碼數(shù)據(jù)庫(kù)中的字符串。

用create_engine建立數(shù)據(jù)庫(kù)引擎,如果數(shù)據(jù)庫(kù)開啟了SSL鏈路,則在此處需要傳入ssl客戶端證書的文件路徑。

用scoped_session(sessionmaker(bind=engine))建立會(huì)話類型SessionType,并定義函數(shù)GetSession()用以創(chuàng)建SessionType的實(shí)例。

至此,已經(jīng)可以用GetSession()函數(shù)創(chuàng)建數(shù)據(jù)庫(kù)會(huì)話并進(jìn)行數(shù)據(jù)庫(kù)操作了。但為了使之后的數(shù)據(jù)庫(kù)操作的代碼能夠自動(dòng)進(jìn)行事務(wù)處理,本例中定義了上下文函數(shù)session_scope()。在Python中定義上下文函數(shù)的方法是為其加入contextlib包中的contextmanager裝飾器。在上下文函數(shù)中執(zhí)行如下邏輯:在函數(shù)開始時(shí)建立數(shù)據(jù)庫(kù)會(huì)話,此時(shí)會(huì)自動(dòng)建立一個(gè)數(shù)據(jù)庫(kù)事務(wù):當(dāng)發(fā)生異常時(shí)回滾(rollback)事務(wù);當(dāng)退出時(shí)關(guān)閉(close)連接。在關(guān)閉連接時(shí)會(huì)自動(dòng)進(jìn)行事務(wù)提交(commit)操作。

進(jìn)行數(shù)據(jù)庫(kù)操作的代碼:from sqlalchemy import or_,orm

def InsertAccount(user,passwd,title,salary): #新增操作

with session_scope() as session:

account=orm.Account(user_name=user,passwd=passwd,title=title,salary=salary)

session.add(account)

def GetAccount(id=None,user_name=None): #查詢操作

with session_scope() as session:

return session.query(orm.Account).filter(

or_(orm.Account.id==id,orm.Account.user_name=user_name)

).first()

def DeleteAccount(user_name): #刪除操作

with session_scope() as session:

account=GetAccount(user_name=user_name)

if account:

session.delete(account)

def UpdateAccount(id,user_name,password,title,salary): #更新操作

with session_scope() as session:

account=session.query(orm.Account).filter(orm.Account.id==id).first()

if not account:return

account.user_name=user_name

account.password=password

account.salary=salary

account.title=title

InsertAccount("Mark","123","Manager",3000) #調(diào)用新增操作

InsertAccount("帥哥","456","Boss",2000) #調(diào)用新增操作

GetAccount(2) #調(diào)用查詢操作

DeleteAccount("Mark")

UpdateAccount(1,"admin","none","System admin",2500)

本例演示了數(shù)據(jù)庫(kù)中最常用的4種基于記錄的操作:新增、查找、刪除、更新。對(duì)此部分代碼的解析如下:用import語句引入數(shù)據(jù)表(Account)所在的包orm。引入多條件查詢時(shí)使用or_。

每個(gè)函數(shù)中都通過with語句啟用上下文函數(shù)session_scope(),通過它獲取到session對(duì)象,并自動(dòng)開啟新事物。

在InsertAccount中,通過新建一個(gè)表Account實(shí)例,并通過session.add將其添加到數(shù)據(jù)庫(kù)中。由于上下文函數(shù)退出時(shí)會(huì)自動(dòng)提交事務(wù),所以無需顯示的調(diào)用session.commit()使新增生效。

在GetAccount中通過query語句進(jìn)行查詢,查詢條件由filter設(shè)置,多個(gè)查詢條件可以用or_或and_連接。

在DeleteAccount中通過GetAccount查詢?cè)搶?duì)象,如果查詢到了,則直接調(diào)用session.delete()將該對(duì)象刪除。

在InsertAccount()中通過query根據(jù)id查詢記錄,如果查詢到了,則通過設(shè)置對(duì)象的屬性實(shí)現(xiàn)對(duì)記錄的修改。

查詢語句的結(jié)果是一個(gè)對(duì)象集合。查詢語句后面的first()函數(shù)用于提取該集合中的第一個(gè)對(duì)象,如果用all()函數(shù)替換first()函數(shù),查詢則會(huì)返回該集合。

主流數(shù)據(jù)庫(kù)的連接方式

SQLAlchemy這樣的orm數(shù)據(jù)庫(kù)操作方式可以對(duì)業(yè)務(wù)開發(fā)者屏蔽不同數(shù)據(jù)庫(kù)之間的差異,這樣當(dāng)需要進(jìn)行數(shù)據(jù)庫(kù)遷移時(shí)(比如MySQL遷移到SQLite),則只需要更換數(shù)據(jù)庫(kù)連接字符串。

下表列出了SQLAlchemy連接主流數(shù)據(jù)庫(kù)時(shí)的數(shù)據(jù)庫(kù)字符串的編寫方法:數(shù)據(jù)庫(kù)連接字符串Microsoft SQLServer'mssql+pymssql://[user]:[pass]@[domain]:[port]/[dbname]'

MySQL'mysql://[user]:[pass]@[domain]:[port]/[dbname]'

Oracle'oracle://[user]:[pass]@[domain]:[port/[dbname]]'

PostgreSQL'postgresql://[user]:[pass]@[domain]:[port]/[dbname]'

SQLite'sqlite://[file_pathname]'

超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的alchemy php,Python下SQLAlchemy的简单介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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