摘要:下一篇文章第節查詢條件設置是編程語言下的一款開源軟件。提供了工具包及對象關系映射工具,使用許可證發行。在關閉連接時會自動進行事務提交操作。引入多條件查詢時使用。由于上下文函數退出時會自動提交事務,所以無需顯示的調用使新增生效。
下一篇文章:Python-SQLAlchemy:第2節:查詢條件設置
SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對象關系映射(ORM)工具,SQLAlchemy使用MIT許可證發行。它采用簡單的Python語音,為高效和高性能的數據庫訪問設計,實現了完整的企業級持久模型。SQLAlchemy非常關注數據庫的量級和性能。
本節通過一套例子分析SQLAlchemy的使用方法。
使用SQLAlchemy至少需要3部分代碼,它們分別是定義表、定義數據庫連接、進行增、刪、改、查等邏輯操作。
定義表的實例: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): #假設所有 return True def get_id(self): #返回賬號ID,用方法返回屬性值提高了表的封裝性。 return self.id def is_authenticated(self): #假設已經通過驗證 return True def is_anonymous(self): #具有登陸名和密碼的賬號不是匿名用戶 return False
解析定義表的代碼如下:
SQLAlchemy表之前必須必須引入sqlalchemy.ext.declarative_base,并定義一個它的實例Base。所有表必須繼承自Base。本例中定義了一個賬戶表類Account。
通過__tablename__屬性定義了表在數據庫中實際的名稱account。
引入sqlalchemy包中的Column、Integer、String類型,因為需要用它們定義表中的列。本例在Account表中定義了5個列,分別是整型id和salary,以及字符串類型的user_name、password、title。
在定義列時可以通過給Column傳送參數定義約束。本例中通過primary_key參數將id列定義主鍵,通過nullable參數將user__name和password定義非空。
在表中還可以自定義其他函數。本例中定義了用戶驗證時常用的幾個函數:is__activite()、get__id()、is__authenticate()和is_anonymous()。
定義數據庫連接的示例代碼如下: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()
解析此連接數據部分的代碼如下:
引入數據庫和會話引擎:sqlalchemy.create_engine、sqlalchemy.orm.scoped_session、sqlalchemy.orm.sessionmaker。
定義連接數據庫需要用到的數據庫字符串。本例連接MySQL數據庫,字符串格式為[databse_type]://[user_name]:[password]@[domain]:[port]/[database]?[parameters]。本例中除了必須的連接信息,還傳入了charset參數,指定用utf-8編碼方式解碼數據庫中的字符串。
用create_engine建立數據庫引擎,如果數據庫開啟了SSL鏈路,則在此處需要傳入ssl客戶端證書的文件路徑。
用scoped_session(sessionmaker(bind=engine))建立會話類型SessionType,并定義函數GetSession()用以創建SessionType的實例。
至此,已經可以用GetSession()函數創建數據庫會話并進行數據庫操作了。但為了使之后的數據庫操作的代碼能夠自動進行事務處理,本例中定義了上下文函數session_scope()。在Python中定義上下文函數的方法是為其加入contextlib包中的contextmanager裝飾器。在上下文函數中執行如下邏輯:在函數開始時建立數據庫會話,此時會自動建立一個數據庫事務:當發生異常時回滾(rollback)事務;當退出時關閉(close)連接。在關閉連接時會自動進行事務提交(commit)操作。
進行數據庫操作的代碼: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) #調用新增操作 InsertAccount("帥哥","456","Boss",2000) #調用新增操作 GetAccount(2) #調用查詢操作 DeleteAccount("Mark") UpdateAccount(1,"admin","none","System admin",2500)
本例演示了數據庫中最常用的4種基于記錄的操作:新增、查找、刪除、更新。對此部分代碼的解析如下:
用import語句引入數據表(Account)所在的包orm。引入多條件查詢時使用or_。
每個函數中都通過with語句啟用上下文函數session_scope(),通過它獲取到session對象,并自動開啟新事物。
在InsertAccount中,通過新建一個表Account實例,并通過session.add將其添加到數據庫中。由于上下文函數退出時會自動提交事務,所以無需顯示的調用session.commit()使新增生效。
在GetAccount中通過query語句進行查詢,查詢條件由filter設置,多個查詢條件可以用or_或and_連接。
在DeleteAccount中通過GetAccount查詢該對象,如果查詢到了,則直接調用session.delete()將該對象刪除。
在InsertAccount()中通過query根據id查詢記錄,如果查詢到了,則通過設置對象的屬性實現對記錄的修改。
查詢語句的結果是一個對象集合。查詢語句后面的first()函數用于提取該集合中的第一個對象,如果用all()函數替換first()函數,查詢則會返回該集合。
主流數據庫的連接方式SQLAlchemy這樣的orm數據庫操作方式可以對業務開發者屏蔽不同數據庫之間的差異,這樣當需要進行數據庫遷移時(比如MySQL遷移到SQLite),則只需要更換數據庫連接字符串。
下表列出了SQLAlchemy連接主流數據庫時的數據庫字符串的編寫方法:
數據庫 | 連接字符串 |
---|---|
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]" |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44834.html
摘要:上一篇文章第節入門下一篇文章第節關系操作在實際編程中需要根據各種不同的條件查詢數據庫記錄,查詢條件被稱為過濾器。通配符用百分號表示。以下條語句查詢結果相同,都是為的記錄。引入或邏輯關鍵字查詢是或者為的記錄,返回結果為為的記錄 上一篇文章:Python-SQLAlchemy:第1節:SQLAlchemy入門下一篇文章:Python-SQLAlchemy:第3節:關系操作 在實際編程中需...
摘要:本節圍繞在中如何定義關系及如何使用關系進行查詢進行講解,使讀者能夠快速掌握的關系操作。班級與學生為一對多關系,班級與老師之間為多對多關系。三年二班多對多關系的使用通過關聯模型實現,在其中分別設置模型和的外鍵,并且在父模型中設置相應的實現。 上一篇文章:Python-SQLAlchemy:第2節:查詢條件設置下一篇文章:Python-SQLAlchemy:第4節:級聯 關系數據庫是建立...
摘要:上一篇文章第節關系操作級聯是在一對多關系中父表與子表進行聯動操作的數據庫術語。注意級聯獨立于本身針對外鍵的級聯定義。代碼執行后數據庫表中的內容的變化表五年二班理想路號樓表理想男靜安區女靜安區小馬哥女閘口區張三韓永躍男靜安區 上一篇文章:Python-SQLAlchemy:第3節:關系操作 級聯是在一對多關系中父表與子表進行聯動操作的數據庫術語。因為父表與子表通過外鍵關聯,所以對父表或...
摘要:因為是工作在一個內部,有時候我們可能不小心做了一些誤刪除的操作,可以回滾。我們先修改的用戶名為,然后重新添加一個新,但是記住這個時候我們還沒有。集合類型可以是各種合法類型,比如,但是默認集合是一個。 官方文檔 Initialization # 檢查是否已經安裝以及版本號 >>> import sqlalchemy >>> sqlalchemy.__version__ ’1.1.4‘ ...
閱讀 3574·2019-08-30 15:55
閱讀 1373·2019-08-29 16:20
閱讀 3656·2019-08-29 12:42
閱讀 2661·2019-08-26 10:35
閱讀 1010·2019-08-26 10:23
閱讀 3405·2019-08-23 18:32
閱讀 897·2019-08-23 18:32
閱讀 2892·2019-08-23 14:55