1 基礎(chǔ)知識介紹 1.1 ORM框架介紹ORM(Object Ralational Mapping,對象關(guān)系映射),用來把對象模型表示的對象映射到基于S Q L 的關(guān)系模型數(shù)據(jù)庫結(jié)構(gòu)中去。我們在具體的操作實(shí)體對象的時候,就不需要再去和復(fù)雜的 SQ L 語句打交道,只需簡單的操作實(shí)體對象的屬性和方法。 常見的ORM框架 SQLAlchemy:SQLAlchemy 采用了數(shù)據(jù)映射模式,其工作單元主要使得有必要限制所有的數(shù)據(jù)庫操作代碼到一個特定的數(shù)據(jù)庫session,在該session中控制每個對象的生命周期 。 SQLObject:是一種流行的對象關(guān)系管理器,用于為數(shù)據(jù)庫提供對象接口,其中表為類,行為實(shí)例,列為屬性。SQLObject包含一個基于Python對象的查詢語言,使SQL更抽象,并為應(yīng)用程序提供了大量的數(shù)據(jù)庫獨(dú)立性。 Storm :是一個介于 單個或多個數(shù)據(jù)庫與Python之間 映射對象的 Python ORM 。為了支持動態(tài)存儲和取回對象信息,它允許開發(fā)者構(gòu)建跨數(shù)據(jù)表的復(fù)雜查詢。Stom中 table class 不需要是框架特定基類 的子類 。每個table class是 的sqlobject.SQLObject 的子類。 Django's ORM : 因?yàn)镈jango的ORM 是緊嵌到web框架的,所以就算可以也不推薦,在一個獨(dú)立的非Django的Python項(xiàng)目中使用它的ORM。Django,一個最流行的Python web框架, 有它獨(dú)有的 ORM。 相比 SQLAlchemy, Django 的 ORM 更吻合于直接操作SQL對象,操作暴露了簡單直接映射數(shù)據(jù)表和Python類的SQL對象 。 1.2 SQLAlchemy介紹sqlalchemy是Python ORM的開源框架,使用它可以快速方便的構(gòu)建數(shù)據(jù)庫模型 SQLAlchemy框架
SQLALchemy本身無法操作數(shù)據(jù)庫,需要依賴pymysql第三方模塊,Dialect用于和數(shù)據(jù)API進(jìn)行交流,根據(jù)配置文件的不同調(diào)用不同的數(shù)據(jù)庫API,從而實(shí)現(xiàn)對數(shù)據(jù)庫的操作 使用pymysql連接數(shù)據(jù)庫格式: mysql + pymysql: / / <username>:<password>@<host> / <dbname>[?<options>] 2 使用SQLAlchemy2.1安裝SQLAlchemy與檢查是否安裝成功#安裝pip install SQLAlchemy#檢查是否安裝成功C:\Users\lsl\Desktop>pythonPython 3.7.0rc1 (v3.7.0rc1:dfad352267, Jun 12 2018, 07:05:25) [MSC v.1914 64 bit (AMD64)] on win32Type 'help', 'copyright', 'credits' or 'license' for more information.>>> import sqlalchemy>>> sqlalchemy.__version__'1.3.18'復(fù)制代碼 2.2使用SQLAlchemy對數(shù)據(jù)庫的表進(jìn)行操作2.2.1創(chuàng)建連接對象也就是為了連接到本地的數(shù)據(jù)庫 create_engine中的字段的意義介紹: engine = create_engine(' dialect+driver://username:password@host:port/database ') dialect -- 數(shù)據(jù)庫類型 driver -- 數(shù)據(jù)庫驅(qū)動選擇(我的數(shù)據(jù)庫驅(qū)動選擇是pymysql,默認(rèn)會調(diào)用MySQLdb,如果運(yùn)行的時候提示ImportError: No module named 'MySQLdb'/ImportError: No module named 'pymysql',則意味著沒有安裝你想使用的數(shù)據(jù)驅(qū)動,安裝命令:pip install pymysql) username -- 數(shù)據(jù)庫用戶名 password -- 用戶密碼 host 服務(wù)器地址 port 端口 database 數(shù)據(jù)庫 創(chuàng)建連接:
2.2.2 簡單查詢——使用SQL語句 result = engine.execute('select * from students')//在execute()里的參數(shù)是查詢的sql語句print(result.fetchall()) //打印出查詢的結(jié)果復(fù)制代碼 2.2.3 創(chuàng)建映射 創(chuàng)建映射后我們就可以減少sql語句對數(shù)據(jù)庫的操作,而是通過操作我們建立的與數(shù)據(jù)庫中的數(shù)據(jù)表的class來對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行操作。 創(chuàng)建一個py文件來做數(shù)據(jù)表的映射text2.py
在要進(jìn)行操作之前還要創(chuàng)建一下會話,Session的主要目的是建立與數(shù)據(jù)庫的會話,它維護(hù)你加載和關(guān)聯(lián)的所有數(shù)據(jù)庫對象。它是數(shù)據(jù)庫查詢(Query)的一個入口。在Sqlalchemy中,數(shù)據(jù)庫的查詢操作是通過Query對象來實(shí)現(xiàn)的。而Session提供了創(chuàng)建Query對象的接口。 # 創(chuàng)建會話session = sessionmaker(engine)mySession = session()復(fù)制代碼 接下來,我們就可以通過操作User類來操作數(shù)據(jù)表students 2.2.4 查詢 查詢students表中所有的數(shù)據(jù)
查詢students表中第一條數(shù)據(jù) result = mySession.query(User).first()print(result.name) #打印對象屬性復(fù)制代碼 通過id查詢數(shù)據(jù)(id=2)
自定義過濾條件 result = mySession.query(User).filter(text('id>:id')).params(id=2).all()復(fù)制代碼 根據(jù)主鍵查詢
其他查詢操作介紹
2.2.5 增加數(shù)據(jù)(添加一條數(shù)據(jù) name=”小紅“),注意要commit user = User(name='小紅')mySession.add(user)mySession.commit()復(fù)制代碼 2.2.6刪除數(shù)據(jù)(根據(jù)id進(jìn)行修改)
2.2.7修改數(shù)據(jù)(修改一條數(shù)據(jù),把小紅的名字修改成小白) mySession.query(User).filter(User.name=='小紅').update({'name':'小白'})mySession.commit()復(fù)制代碼 3 常用條件查詢代碼
4 總的代碼#importfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.orm import sessionmakerfrom sqlalchemy.pool import NullPool#創(chuàng)建連接對象也就是為了連接到本地的數(shù)據(jù)庫engine = create_engine('mysql+pymysql://root:root@localhost:3306/testdab', encoding='utf-8', # 編碼格式 echo=True, # 是否開啟sql執(zhí)行語句的日志輸出 pool_recycle=-1, # 多久之后對線程池中的線程進(jìn)行一次連接的回收(重置) (默認(rèn)為-1),其實(shí)session并不會被close poolclass=NullPool # 無限制連接數(shù) ) #聲名BaseBase = declarative_base()# 創(chuàng)建會話session = sessionmaker(engine)mySession = session() # 創(chuàng)建類,繼承基類,用基本類型描述數(shù)據(jù)庫結(jié)構(gòu)class User(Base): __tablename__ = 'students' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(64),nullable=False) __table_args__ = { 'mysql_charset': 'utf8' } #sql語句查詢result = engine.execute('select * from students')print(result.fetchall()) # 查詢第一條result = mySession.query(User).first()print(result.name) #打印對象屬性# 查詢所有result = mySession.query(User).all()print(result[0])# 查詢id為2的result = mySession.query(User).filter_by(id=2).first()print(result.name)# 分頁查詢 0,2result = mySession.query(User).filter(User.id>1).limit(2).offset(0).all()print(result)#插入新數(shù)據(jù)user = User(name='小紅')mySession.add(user)mySession.commit()result = mySession.query(User).filter_by(name='小紅').first()print(result.name)#修改已有數(shù)據(jù)mySession.query(User).filter(User.name=='小紅').update({'name':'小白'})mySession.commit()result = mySession.query(User).filter_by(name='小白').first()print(result.name)#刪除數(shù)據(jù)mySession.query(User).filter(User.id == 1).delete()mySession.commit()result = mySession.query(User).first()print(result.name) #打印對象屬性復(fù)制代碼 |
|