1.ORMpython
在服務器後臺,數據是要存儲在數據庫的,可是若是項目在開發和部署的時候,是使用的不一樣的數據庫,該怎麼辦呢?是否是須要把全部的 SQL 語句都再從新寫一遍呢?mysql
ORMsql
ORM全稱 Object Relational Mapping對象關係映射數據庫
經過 ORM 能夠不用關心後臺是使用的哪一種數據庫,只須要按照 ORM 所提供的語法規則去書寫相應的代碼, ORM 就會自動的轉換成對應對應數據庫的 SQL 語句服務器
2. SQLAlchemy鏈接數據庫session
第一步:安裝app
安裝: mysql測試
安裝python包: pymysql、sqlalchemyfetch
pip安裝 python 包url
pip install -i https://pypi.douban.com/simple pymysql
pip install -i https://pypi.douban.com/simple sqlalchemy 這裏是使用國內的源
建立/data目錄,在下面建立connect.py文件
from sqlalchemy import create_engine #第二步:導入模塊
#第三步:數據庫數據 USERNAME = 'admin' PASSWORD = 'Root110qwe' HOST = '127.0.0.1' PORT = 3306 DATABASE = 'mydb' Db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( #第四步:數據鏈接 URL
USERNAME, PASSWORD, HOST, PORT, DATABASE ) engine = create_engine(Db_url) #第五步:鏈接數據庫
if __name__ == '__main__': #第六步:測試鏈接
connection = engine.connect() #定義遊標 result = connection.execute('select 1') print(result.fetchone())
3.建立Module
第一步:建立 Module 的 Base 類
在connect.py文件中生成Base類
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base(engine) #數據庫建模使用繼承來創建
對象關係型映射,數據庫中的表與python中的類相對應,建立的類必須繼承自 sqlalchemy 中的基類。
使用 declarative 方法定義的映射類依據一個基類,這個基類是維繫類和數據表關係的目錄。
應用一般只須要有一個 Base 的實例。咱們經過 declarative_base() 功能建立一個基類。
第二步:建立 Module
新增user_modules.py文件
#這個文件是用來創建模型 from connect import Base from sqlalchemy import Column,Integer,String,DateTime,Boolean from datetime import datetime class User(Base): ''' 創建一個User模型,創建一張user表 ''' __tablename__ = 'user' id = Column(Integer,autoincrement=True,primary_key=True) username = Column(String(20)) password = Column(String(20)) create_time = Column(DateTime,default=datetime.now()) _locked = Column(Boolean,default=False,nullable=False) #當前用戶是否已經登陸,是否還能登陸
#第三步:建立 Module
if __name__ == '__main__': Base.metadata.create_all() #建立表格
再次強調,咱們用類來表示數據庫裏面的表!!!
這些表的類都繼承於咱們的Base基類。
在類裏面咱們定義一些屬性,這個屬性經過映射,就對應表裏面的字段
Module
__tablename__: 數據庫中的表名
Column: 用來建立表中的字段的一個方法
Integer: 整形,映射到數據庫中的int類型
String: 字符類型,映射到數據庫中的varchar類型,使用時,須要提供一個字符長度
DateTime: 時間類型
4. 數據的增刪改查
第一步:建立會話
在connect.py中添加
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) #生成一個會話類,用來操做數據 session = Session()
在對錶數據進行增刪改查以前,先須要創建會話,創建會話以後才能進行操做,就相似於文件要打開以後才能對文件內容操做
add
add 是添加一條數據, add_all 添加多條數據
query
query 就是查詢的意思,在 SQLAlchemy 中也用來查詢數據
all 是查詢全部的意思
first 是查詢第一條數據
在後面會詳細介紹更過的用法
update
update更新是須要使用字典傳值
delete
使用 delete 方法來刪除數據
建立test_user_module.py文件。
from connect import session from user_modules import User def add_user(): '''添加數據''' person = User(username='shiwei',password='1234') session.add_all([ #接收一個列表,添加多條,每一條是列表裏面的一個元素 User(username='塔卡',password='12341'), User(username='小潑',password='55432'), User(username='清空',password='12341'), ]) # session.add(person) #會默認開啓一個事物,添加一條 session.commit() #提交事務 def search_user(): '''查看數據''' rows = session.query(User).all() #查詢全部 # rows = session.query(User).first() #查詢第一條 print(rows) def update_user(): '''更新數據''' #更新是須要使用字典傳值 session.query(User).filter(User.username == '塔卡').update({User.password:'23115'}) session.commit() def delete_user(): '''刪除數據''' rows = session.query(User).filter(User.username == '式微')[0] #須要使用索引取原生SQL值,否則會是 print(rows) session.delete(rows) session.commit() if __name__ == '__main__': delete_user()
執行查詢search_user()時,會顯示以下內容。須要對module模塊進行重寫__repr__
[<user_modules.User object at 0xb679104c>, <user_modules.User object at 0xb679190c>, <user_modules.User object at 0xb679194c>, <user_modules.User object at 0xb679198c>, <user_modules.User object at 0xb67919cc>]
class User(Base): ''' 創建一個User模型,創建一張user表 ''' __tablename__ = 'user' id = Column(Integer,autoincrement=True,primary_key=True) username = Column(String(20)) password = Column(String(20)) create_time = Column(DateTime,default=datetime.now()) _locked = Column(Boolean,default=False,nullable=False) #當前用戶是否已經登陸,是否還能登陸 def __repr__(self): return ''' <User(id=%s,username=%s,create_time=%s,_locked=%s)> '''%(self.id,self.username,self.password,self._locked)
從新運行search_user.py文件,展現結果以下,解析成容易讀取的信息: