(轉)python之sqlalchemy詳解
阿新 • • 發佈:2021-10-17
原文:https://zhuanlan.zhihu.com/p/71134861
ps = session.query(Person).first()
print(ps)
# 3、修改制定行資料
person = session.query(Person).first()
print(person)
# 修改表資料,物件.屬性 = ' '
person.name = 'hahaha'
# 別忘記要提交哦~
session.commit()
# 4、刪除表資料
person = session.query(Person).get(3)
print(person)
session.delete(person)
session.commit()
Column常用資料型別
常用的資料型別,一共是有11個。
注:在SQLAlchemy中不存在double資料型別,使用DECIMAL型別替代
讓我們來分別看下這11個數據型別都有哪些?
- Integer:整型,對映到資料庫中是int型別。
- Float:浮點型別,對映到資料庫中是float型別。他佔據的32位。
浮點型別,有可能會造成精度丟失,特別是在money方面,不可原諒。 - Double(SQLAlchemy中沒有,代替品為DECIMAL):雙精度浮點型別,對映到資料庫中是double型別,佔據64位
- String:可變字元型別,對映到資料庫中是varchar型別.
- Boolean:布林型別,對映到資料庫中的是tinyint型別。
- DECIMAL:定點型別。是專門為了解決浮點型別精度丟失的問題的。在儲存money相關的欄位的時候建議大家都使用這個資料型別。並且這個型別使用的時候需要傳遞兩個引數,第一個引數是用來標記這個欄位總能能儲存多少個數字,第二個引數表示小數點後有多少位。
- Enum:列舉型別。指定某個欄位只能是列舉中指定的幾個值,不能為其他值。在ORM模型中,使用Enum來作為列舉。
- Date:儲存時間,只能儲存年月日。對映到資料庫中是date型別。在Python程式碼中,可以使用
datetime.date
來指定。 - DateTime:儲存時間,可以儲存年月日時分秒毫秒等。對映到資料庫中也是datetime型別。在Python程式碼中,可以使用
datetime.datetime
- Time:儲存時間,可以儲存時分秒。對映到資料庫中也是time型別。在Python程式碼中,可以使用
datetime.time
來指定
ps:注意區分Date/DateTime/Time的儲存資訊!!! - Text:儲存長字串。一般可以儲存6W多個字元
- LONGTEXT:長文字型別,對映到資料庫中是longtext型別(不過這個只有mysql有,orcale沒有)
上述就是11個數據型別,因為這裡把不存在的double也新增上了,所以看起來是12個。
下面就讓咱們一起來進行驗證。
程式碼實現
# 依次匯入常用的資料型別
from sqlalchemy import create_engine, Column, Integer, String,Float,DECIMAL,Boolean,Date,DateTime,Time,Text,Enum
# 從sqlalchemy的方言模組dialects匯入mysql專有的LONGTEXT,長文字型別
from sqlalchemy.dialects.mysql import LONGTEXT
# 在python3.x中有enum模組
import enum
#匯入時間了
from datetime import datetime,date,time
# 用`declarative_base`根據`engine`建立一個ORM基類。
from sqlalchemy.ext.declarative import declarative_base
# 引入建立py和資料庫連線的sessionmaker函式
from sqlalchemy.orm import sessionmaker
# 準備連線資料庫基本資訊
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'first_sqlalchemy'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI = 'mysql+pymysql://{username}:{pwd}@{host}:{port}/{db}?charset=utf8' \
.format(username=USERNAME, pwd=PASSWORD, host=HOSTNAME, port=PORT, db=DATABASE)
# 建立資料庫引擎
engine = create_engine(DB_URI)
Base = declarative_base(engine)
# 需求:常用的資料型別
# 列舉另外一種寫法,匯入enum模組,定義列舉類
class TagEnum(enum.Enum):
python = "PYTHON"
flask = 'FLASK'
django = 'DJANGO'
class News(Base):
__tablename__ = 'news'
id = Column(Integer,primary_key=True,autoincrement=True)
price1 = Column(Float) # 不過儲存資料時存在精度丟失的問題
price2 = Column(DECIMAL(10,4))
title = Column(String(50))
is_delete = Column(Boolean)
tag1 = Column(Enum('PYTHON','FLASK','DJANGO')) # 列舉的常規寫法(推薦)
tag2 = Column(Enum(TagEnum)) # 另一種寫法
create_time1 = Column(Date)
create_time2 = Column(DateTime)
create_time3 = Column(Time)
content1 = Column(Text