知識(shí)點(diǎn):
- 什么是sqlalchemy
- 環(huán)境搭建
- 使用sqlalchemy
- sqlalchemy對(duì)象映射
- 常用的過濾方法
- sqlalchemy常用的數(shù)據(jù)類型
什么是sqlalchemy
ORM 全稱 Object Relational Mapping對(duì)象關(guān)系映射。
SQLAlchemy 是一個(gè)數(shù)據(jù)庫的ORM框架,python操作數(shù)據(jù)庫的工具ORM 將數(shù)據(jù)庫中的表與面向?qū)ο笳Z言中的類建立了一種對(duì)應(yīng)關(guān)系。
部署環(huán)境
第一、mysql 數(shù)據(jù)庫。
第二、pymysql 用于連接 MySQL 服務(wù)器的一個(gè)庫
通過e裝 : pip install pymysql
第三、sqlalchemy 數(shù)據(jù)庫的ORM框架
通過pip安裝 : pip install sqlalchemy
注意:
pip安裝是在python的環(huán)境變量配置好的前提下打開windows上的命令提示符進(jìn)行安裝。
安裝完成后打開python IDLE,通過import sqlalchemy測(cè)試是否安裝成功。
使用sqlaclchemy
從sqlalchemy中導(dǎo)入create_engin,創(chuàng)建引擎建立與數(shù)據(jù)庫的連接。
from sqlalchemy import create_engine
準(zhǔn)備連接數(shù)據(jù)庫的數(shù)據(jù):
HOSTNAME = '127.0.0.1' # ip地址
PORT = '3306' # 端口號(hào)
DATABASE = 'sqlceshi' # 數(shù)據(jù)庫名
USERNAME = 'zhiliaoawen' # 用戶名
PASSWORD = 'zhiliaoawen' # 用戶登錄密碼
DB_URI的格式:
數(shù)據(jù)庫類型+數(shù)據(jù)庫驅(qū)動(dòng)名稱://用戶名:密碼@機(jī)器地址:端口號(hào)/數(shù)據(jù)庫名?字符編碼
DB_URI=mysql+pymysql://<username>:<password>@<host>/<dbname>charset=utf8
engine = create_engine(DB_URI)
- 聲明映射
對(duì)象關(guān)系型映射,數(shù)據(jù)庫中的表與python中的類相對(duì)應(yīng),創(chuàng)建的類必須繼承自sqlalchemy中的基類。
使用Declarative方法定義的映射類依據(jù)一個(gè)基類,
這個(gè)基類是維系類和數(shù)據(jù)表關(guān)系的目錄
應(yīng)用通常只需要有一個(gè)base的實(shí)例。我們通過declarative_base()功能創(chuàng)建一個(gè)基類
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(engine)
創(chuàng)建數(shù)據(jù)表對(duì)應(yīng)的類
這些表的類都繼承于我們的Base基類
定義好一些屬性,與user表中的字段進(jìn)行映射并且這個(gè)屬性要屬于某個(gè)類型
Column用來創(chuàng)建表中的字段的一個(gè)方法
sqlalchemy常用的數(shù)據(jù)類型
Integer:整形,映射到數(shù)據(jù)庫中的int類型。
String:字符類型,映射到數(shù)據(jù)庫中的varchar類型,使用時(shí),需要提供一個(gè)字符長(zhǎng)度。
from sqlalchemy import Column,Integer,String數(shù)據(jù)操作
增、刪、改、查
創(chuàng)建會(huì)話
需要定義個(gè)session會(huì)話對(duì)象
sessionmaker初始化一個(gè)類對(duì)象
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()
增
創(chuàng)建一個(gè)對(duì)象
將數(shù)據(jù)保存到數(shù)據(jù)庫中:
將創(chuàng)建的user對(duì)象添加到會(huì)話對(duì)象中
添加單個(gè)對(duì)象:
session.add(user)
添加多個(gè)對(duì)象:
session.add_all([user1,user2,....])
將會(huì)話對(duì)象進(jìn)行提交:
session.commit()
如果你不想將修改提交則使用回滾:session.rollback()
查
通過session的query這個(gè)對(duì)象完成的
查找User這張表中的所有數(shù)據(jù)
session.query(User).all()
查找User這張表中的第一條數(shù)據(jù)
session.query(User).first()
通過username=taka來進(jìn)行過濾查找
session.query(User).filter_by(username='taka')
通過get方法,用主鍵查找對(duì)象
session.query(User).get(primary_key)
補(bǔ)充:
filter 引用列名時(shí),使用“類名.屬性名”的方式,比較使用兩個(gè)等號(hào)“==”
filter_by 引用列名時(shí),使用“屬性名”,比較使用一個(gè)等號(hào)“=” 賦值這種形式
改
先從數(shù)據(jù)庫中找到數(shù)據(jù)
修改成需要的數(shù)據(jù)
做事物的提交操作:
user = session.query(User).filter_by(id=3)[0]
user.username = 'awen'
session.commit()
刪
先從數(shù)據(jù)庫中獲取數(shù)據(jù)
使用session.delete方法進(jìn)行刪除
做事務(wù)的提交操作:
user = session.query(User).filter_by(username='taka').first()
user.delete(user)
session.commit()
常用過濾方法
filter和filter_by的區(qū)別:
filter 引用列名時(shí),使用“類名.屬性名”的方式,比較使用兩個(gè)等號(hào)“==”
filter_by 引用列名時(shí),使用“屬性名”,比較使用一個(gè)等號(hào)“=”
等于:
session.query(User).filter(User.username == 'taka').all()
不等于:
session.query(User).filter(User.username != 'taka').all()
模糊匹配like:
session.query(User).filter(User.username.like('taka%')).all()
成員所屬(in_):
session.query(User).filter(User.username.in_(['tk','塔卡','taka'])).all()
不屬于notin:
session.query(User).filter(~User.username.in_(['tk','塔卡','taka'])).all()
session.query(User).filter(User.username.notin_(['tk','塔卡','taka'])).all()
為空is null:
session.query(User).filter(User.username==None).all()
# 或者是
session.query(User).filter(User.username.is_(None)).all()
不為空is not null:
session.query(User).filter(User.username != None).all()
# 或者是
session.query(User).filter(User.username.isnot(None)).all()
多個(gè)條件and:
session.query(User).filter(User.username=='taka',User.password=='123456').all()
session.query(User).filter_by(username='tk',password='1234').all()
條件或or:
from sqlalchemy import or_
session.query(User).filter(or_(User.username=='tk',User.password=='123456')).all()
sqlalchemy常用數(shù)據(jù)類型
- Integer:整型,映射到數(shù)據(jù)庫中的int類型。
- String:字符類型,映射到數(shù)據(jù)庫中的varchar類型,使用時(shí),需要提供一個(gè)字符長(zhǎng)度。
- Text:文本類型,映射到數(shù)據(jù)庫中的text類型。
- Boolean:布爾類型,映射到數(shù)據(jù)庫中的tinyint類型,在使用的時(shí)候,傳遞True/False進(jìn)去。
- Date:日期類型,沒有時(shí)間。映射到數(shù)據(jù)庫中是date類型,
在使用的時(shí)候,傳遞datetime.date()進(jìn)去。 - DateTime:日期時(shí)間類型。映射到數(shù)據(jù)庫中的是datetime類型,
在使用的時(shí)候,傳遞datetime.datetime()進(jìn)去。 - Float:浮點(diǎn)類型。