1 基礎(chǔ)知識介紹 1.1 ORM框架介紹ORM(Object Ralational Mapping,對象關(guān)系映射),,用來把對象模型表示的對象映射到基于S Q L 的關(guān)系模型數(shù)據(jù)庫結(jié)構(gòu)中去,。我們在具體的操作實體對象的時候,就不需要再去和復雜的 SQ L 語句打交道,,只需簡單的操作實體對象的屬性和方法,。 常見的ORM框架 SQLAlchemy:SQLAlchemy 采用了數(shù)據(jù)映射模式,其工作單元主要使得有必要限制所有的數(shù)據(jù)庫操作代碼到一個特定的數(shù)據(jù)庫session,,在該session中控制每個對象的生命周期 ,。 SQLObject:是一種流行的對象關(guān)系管理器,用于為數(shù)據(jù)庫提供對象接口,,其中表為類,,行為實例,列為屬性,。SQLObject包含一個基于Python對象的查詢語言,,使SQL更抽象,并為應用程序提供了大量的數(shù)據(jù)庫獨立性,。 Storm :是一個介于 單個或多個數(shù)據(jù)庫與Python之間 映射對象的 Python ORM ,。為了支持動態(tài)存儲和取回對象信息,它允許開發(fā)者構(gòu)建跨數(shù)據(jù)表的復雜查詢,。Stom中 table class 不需要是框架特定基類 的子類 ,。每個table class是 的sqlobject.SQLObject 的子類。 Django's ORM : 因為Django的ORM 是緊嵌到web框架的,,所以就算可以也不推薦,,在一個獨立的非Django的Python項目中使用它的ORM。Django,一個最流行的Python web框架,, 有它獨有的 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ù)配置文件的不同調(diào)用不同的數(shù)據(jù)庫API,,從而實現(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'復制代碼 2.2使用SQLAlchemy對數(shù)據(jù)庫的表進行操作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,默認會調(diào)用MySQLdb,,如果運行的時候提示ImportError: No module named 'MySQLdb'/ImportError: No module named 'pymysql',,則意味著沒有安裝你想使用的數(shù)據(jù)驅(qū)動,安裝命令:pip install pymysql) username -- 數(shù)據(jù)庫用戶名 password -- 用戶密碼 host 服務器地址 port 端口 database 數(shù)據(jù)庫 創(chuàng)建連接:
2.2.2 簡單查詢——使用SQL語句 result = engine.execute('select * from students')//在execute()里的參數(shù)是查詢的sql語句print(result.fetchall()) //打印出查詢的結(jié)果復制代碼 2.2.3 創(chuàng)建映射 創(chuàng)建映射后我們就可以減少sql語句對數(shù)據(jù)庫的操作,而是通過操作我們建立的與數(shù)據(jù)庫中的數(shù)據(jù)表的class來對數(shù)據(jù)庫中的數(shù)據(jù)進行操作,。 創(chuàng)建一個py文件來做數(shù)據(jù)表的映射text2.py
在要進行操作之前還要創(chuàng)建一下會話,Session的主要目的是建立與數(shù)據(jù)庫的會話,,它維護你加載和關(guān)聯(lián)的所有數(shù)據(jù)庫對象,。它是數(shù)據(jù)庫查詢(Query)的一個入口。在Sqlalchemy中,,數(shù)據(jù)庫的查詢操作是通過Query對象來實現(xiàn)的,。而Session提供了創(chuàng)建Query對象的接口。 # 創(chuàng)建會話session = sessionmaker(engine)mySession = session()復制代碼 接下來,,我們就可以通過操作User類來操作數(shù)據(jù)表students 2.2.4 查詢 查詢students表中所有的數(shù)據(jù)
查詢students表中第一條數(shù)據(jù) result = mySession.query(User).first()print(result.name) #打印對象屬性復制代碼 通過id查詢數(shù)據(jù)(id=2)
自定義過濾條件 result = mySession.query(User).filter(text('id>:id')).params(id=2).all()復制代碼 根據(jù)主鍵查詢
其他查詢操作介紹
2.2.5 增加數(shù)據(jù)(添加一條數(shù)據(jù) name=”小紅“),,注意要commit user = User(name='小紅')mySession.add(user)mySession.commit()復制代碼 2.2.6刪除數(shù)據(jù)(根據(jù)id進行修改)
2.2.7修改數(shù)據(jù)(修改一條數(shù)據(jù),把小紅的名字修改成小白) mySession.query(User).filter(User.name=='小紅').update({'name':'小白'})mySession.commit()復制代碼 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, # 多久之后對線程池中的線程進行一次連接的回收(重置) (默認為-1),其實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) #打印對象屬性復制代碼 |
|