「Flask筆記」 sql基本操作

「Flask筆記」 sql基本操作

資源介紹參數
資源類別: Python
如遇問題: 聯繫客服/留言反饋
釋放雙眼,帶上耳機,聽聽看~!

數據庫選擇mysql,先安裝相關的包
在虛擬環境下運行
pip3 install SQLAlchemy
pip3 install pymysql

連接數據庫

連接數據庫
這裡使用配置文件的方法返回

#setting.py
def conn():
    HOSTNAME = '127.0.0.1'
    DATABASE = 'flask'
    PORT = '3306'
    USERNAME = 'root'
    PASSWORD = 'root'

    DB_URL = "mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,database=DATABASE)

    return DB_URL
from sqlalchemy import create_engine

import setting

DB_URL = setting.conn()
engine = create_engine(DB_URL)

conn = engine.connect()
result = conn.execute('select 1')
print(result.fetchone()) #(1,)

結果打印一個(1,),鏈接數據庫成功

SQLAlchemy ORM模型

1.ORM Object Relationship Mapping
2.模型與表之間的映射

SQLAlchemy
採用寫原生sql的方式在代碼中會出現大量的sql語句,會出現一些問題:

sql語句重複利用率不高,越複雜的sql語句條件越多,代碼越長。會出現很多相近的sql語句
很多sql語句是在業務邏輯中拼出來的,如果有數據庫需要更改,就要去修改這些邏輯,這會很容易漏掉對某些sql語句的修改。
寫sql時容易忽略web安全問題,給未來造成隱患
ORM,全稱Object Relational Mapping,中文叫做對象關係映射,通過ORM可以通過類的方式去操作數據庫,而不用再寫原生的sql語句。通過把表映射成類,把行作實例,把字段作為屬性,ORM在執行對象操作的時候最終還是會把對象的操作轉換為數據庫原生語句。使用ORM有許多有點:

易用性:使用ORM做數據庫的開發可以有效的減少重複sql語句的概率,寫出來的模型也更加直觀清晰。
性能損耗小:ORM轉換成底層數據庫操作指令確實會有一些開銷。但從實際的情況來看,這種性能損耗很少,只要不是對性能有嚴格的要求,綜合考慮開發效率,代碼的閱讀性,帶來的好處要遠大於性能損耗,而且項目越大作用越明顯。
設計靈活:可以輕鬆的寫出複雜的查詢
可移植性:SQLAlchemy封裝了底層的數據庫實現,支持多個關係數據庫引擎,包括流行的MySQL、PostgreSQL和SQLite。可以非常輕鬆的切換數據庫

使用SQLAlchemy創建數據表

from sqlalchemy import create_engine,Column,Integer,String #導入模塊,表的數據類型
from sqlalchemy.ext.declarative import declarative_base #用來返回一個基類
import setting

class Sql(Base):
    __tablename__ = 'sql_test'
    id = Column(Integer,primary_key=True,autoincrement=True)
    text = Column(String(20))
    name = Column(String(20))

Base.metadata.create_all()

運行後sql命令行里檢視結果,成功創建數據表

實現增刪改查

from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.orm import sessionmaker
import setting

DB_URL = setting.conn()
engine = create_engine(DB_URL)

Session = sessionmaker(engine)()  #在sessionmaker種實現了python的__call__魔術方法,調用的時候返回一個可調用的對象,然後返回他的基類

def add_data():
    data = Sql(text='i want flag',name='fl4g') #前面創建的數據表類
    Session.add(data)
    Session.commit()
# 添加多條
def add_more_data():
    data1 = Sql(text='i want flag',name='fl4g')
    data2 = Sql(text='i want flag too',name='f1ag')
    Session.add_all([data1,data2]) #提交一個列表,並且要使用add_all方法
    Session.commit()

為了更好的檢視效果,可以在上面創建的類種實現__str__魔術方法,即當對象被直接調用的時候,執行裡面的代碼

def __str__(self):
    return "<data(id:%s,text:%s,name:%s)>" % (self.id,self.text,self.name)
#查找所有
def search_data():
    all_data=Session.query(Sql).all()
    for q in all_data:
        print(q)
#按條件查找 使用filter_by
def search_data():
    all_data=Session.query(Sql).filter_by(name='fl4g').all()
    for q in all_data:
        print(q)
#按條件查找 使用filter
def search_data():
    all_data=Session.query(Sql).filter(Sql.name=='fl4g').all() #這裡不能使用關鍵字參數
    for q in all_data:
        print(q)
#使用get方法查找,get方法十根據id來查找的,只會返回一條數據或者None
def search_data():
    all_data=Session.query(Sql).get(primary_key)
    for q in all_data:
        print(q)

def delete_data():
    data = Session.query(Sql).first()  #選擇第一條數據
    Session.delete(data)
    Session.commit()

def update_data():
    data = Session.query(Sql).first()
    Session.name = 'f14g'
    Session.commit()
聲明:本文為原創作品,版權歸作者所有。未經許可,不得轉載或用於任何商業用途。如若本站內容侵犯了原著者的合法權益,可聯繫我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
0 條回復 A文章作者 M管理員
    暫無討論,說說你的看法吧