成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python-SQLAlchemy:第1節(jié):SQLAlchemy入門

noONE / 1520人閱讀

摘要:下一篇文章第節(jié)查詢條件設(shè)置是編程語言下的一款開源軟件。提供了工具包及對象關(guān)系映射工具,使用許可證發(fā)行。在關(guān)閉連接時會自動進行事務(wù)提交操作。引入多條件查詢時使用。由于上下文函數(shù)退出時會自動提交事務(wù),所以無需顯示的調(diào)用使新增生效。

下一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置

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

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

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

定義表的實例:
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):
        #返回賬號ID,用方法返回屬性值提高了表的封裝性。
        return self.id

    def is_authenticated(self):
        #假設(shè)已經(jīng)通過驗證
        return True

    def is_anonymous(self):
        #具有登陸名和密碼的賬號不是匿名用戶
        return False

解析定義表的代碼如下:

SQLAlchemy表之前必須必須引入sqlalchemy.ext.declarative_base,并定義一個它的實例Base。所有表必須繼承自Base。本例中定義了一個賬戶表類Account。

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

引入sqlalchemy包中的Column、Integer、String類型,因為需要用它們定義表中的列。本例在Account表中定義了5個列,分別是整型id和salary,以及字符串類型的user_name、password、title。

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

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

定義數(shù)據(jù)庫連接的示例代碼如下:
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ù)庫和會話引擎:sqlalchemy.create_engine、sqlalchemy.orm.scoped_session、sqlalchemy.orm.sessionmaker。

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

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

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

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

進行數(shù)據(jù)庫操作的代碼:
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ù)庫中最常用的4種基于記錄的操作:新增、查找、刪除、更新。對此部分代碼的解析如下:

用import語句引入數(shù)據(jù)表(Account)所在的包orm。引入多條件查詢時使用or_。

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

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

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

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

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

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

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

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

下表列出了SQLAlchemy連接主流數(shù)據(jù)庫時的數(shù)據(jù)庫字符串的編寫方法:

數(shù)據(jù)庫 連接字符串
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]"

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44834.html

相關(guān)文章

  • Python-SQLAlchemy2節(jié):查詢條件設(shè)置

    摘要:上一篇文章第節(jié)入門下一篇文章第節(jié)關(guān)系操作在實際編程中需要根據(jù)各種不同的條件查詢數(shù)據(jù)庫記錄,查詢條件被稱為過濾器。通配符用百分號表示。以下條語句查詢結(jié)果相同,都是為的記錄。引入或邏輯關(guān)鍵字查詢是或者為的記錄,返回結(jié)果為為的記錄 上一篇文章:Python-SQLAlchemy:第1節(jié):SQLAlchemy入門下一篇文章:Python-SQLAlchemy:第3節(jié):關(guān)系操作 在實際編程中需...

    selfimpr 評論0 收藏0
  • Python-SQLAlchemy3節(jié):關(guān)系操作

    摘要:本節(jié)圍繞在中如何定義關(guān)系及如何使用關(guān)系進行查詢進行講解,使讀者能夠快速掌握的關(guān)系操作。班級與學生為一對多關(guān)系,班級與老師之間為多對多關(guān)系。三年二班多對多關(guān)系的使用通過關(guān)聯(lián)模型實現(xiàn),在其中分別設(shè)置模型和的外鍵,并且在父模型中設(shè)置相應(yīng)的實現(xiàn)。 上一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置下一篇文章:Python-SQLAlchemy:第4節(jié):級聯(lián) 關(guān)系數(shù)據(jù)庫是建立...

    William_Sang 評論0 收藏0
  • Python-SQLAlchemy4節(jié):級聯(lián)

    摘要:上一篇文章第節(jié)關(guān)系操作級聯(lián)是在一對多關(guān)系中父表與子表進行聯(lián)動操作的數(shù)據(jù)庫術(shù)語。注意級聯(lián)獨立于本身針對外鍵的級聯(lián)定義。代碼執(zhí)行后數(shù)據(jù)庫表中的內(nèi)容的變化表五年二班理想路號樓表理想男靜安區(qū)女靜安區(qū)小馬哥女閘口區(qū)張三韓永躍男靜安區(qū) 上一篇文章:Python-SQLAlchemy:第3節(jié):關(guān)系操作 級聯(lián)是在一對多關(guān)系中父表與子表進行聯(lián)動操作的數(shù)據(jù)庫術(shù)語。因為父表與子表通過外鍵關(guān)聯(lián),所以對父表或...

    henry14 評論0 收藏0
  • Python-SQLALchemy

    摘要:因為是工作在一個內(nèi)部,有時候我們可能不小心做了一些誤刪除的操作,可以回滾。我們先修改的用戶名為,然后重新添加一個新,但是記住這個時候我們還沒有。集合類型可以是各種合法類型,比如,但是默認集合是一個。 官方文檔 Initialization # 檢查是否已經(jīng)安裝以及版本號 >>> import sqlalchemy >>> sqlalchemy.__version__ ’1.1.4‘ ...

    kumfo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<