數據庫選擇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()