解讀sqlalchemy的常用數(shù)據(jù)類型有哪些
sqlalchemy的常用數(shù)據(jù)類型
數(shù)據(jù)類型 | python數(shù)據(jù)類型 | 說明 |
Integer | int | 整形 |
String | str | 字符串 |
Float | float | 浮點(diǎn)型 |
DECIMAL | decimal.Decimal | 定點(diǎn)型 |
Boolean | bool | 布爾型 |
Date | datetime.date | 日期 |
DateTime | datetime.datetime | 日期和時間 |
Time | datetime.time | 時間 |
Enum | str | 枚舉類型 |
Text | str | 文本類型 |
LongText | str | 長文本類型 |
既然我們知道sqlalchemy常用數(shù)據(jù)類型有哪些,下面我們就來看看這些數(shù)據(jù)類型的用法。
首先,打開我們py代碼編輯神器(pycharm),因?yàn)橹案蠹抑v了許多關(guān)于數(shù)據(jù)庫基本配置及連接的文章,在這里我就不在闡述了。
而是直接在此基礎(chǔ)上講解sqlalchemy數(shù)據(jù)類型的用法。
from sqlalchemy import create_engine,Column,Integer from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm.session import sessionmaker DIALCT = "mysql" DRIVER = "pymysql" USERNAME = "root" PASSWORD = "admin" HOST = "127.0.0.1" PORT = "3306" DATABASE = "test" DB_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALCT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE) engine = create_engine(DB_URI) Base = declarative_base(engine) session = sessionmaker(engine)() class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) Base.metadata.drop_all() Base.metadata.create_all()
在講解前,我們先測試下模型是否能夠成功映射到數(shù)據(jù)庫中,運(yùn)行上述代碼
沒有報錯,我們在打開mysql命令行工具,輸入以下命令
嗯,person庫表已成功映射到數(shù)據(jù)庫中。
OK,萬事俱備。下面我們就逐一來講類型的用法。
第一種:Integer
我們在Person模型中新增一個age字段
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) age = Column(Integer)
然后向表中插入一條數(shù)據(jù)
p = Person(age = 22)session.add(p)session.commit()
運(yùn)行上述代碼,然后輸入下方命令檢查數(shù)據(jù)是否插入到表中以及該字段是否為int類型
第二種:String
我們先將age字段注釋掉,然后從sqlalchemy導(dǎo)入String類型(使用某種數(shù)據(jù)類型前,記得將該數(shù)據(jù)類型從sqlalchemy導(dǎo)入,由于篇幅太長,我們下方數(shù)據(jù)類型省略該步驟),再新增一個name字段(括號中的20表示該字符串最大長度為20)
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) name = Column(String(20))
插入一條數(shù)據(jù)試試
p = Person(name = "tom") session.add(p) session.commit()
運(yùn)行上述代碼,然后輸入下方命令檢查數(shù)據(jù)是否插入到表中以及該字段是否為string類型(映射到數(shù)據(jù)庫,對應(yīng)varchar類型)
第三種:Float
什么情況下會用到Float類型?比如存儲體重、價格等.....
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) # name = Column(String(20)) price = Column(Float)
插入測試數(shù)據(jù)
p = Person(price = 123.456789) session.add(p) session.commit()
運(yùn)行上述代碼,然后輸入下方命令檢查數(shù)據(jù)是否插入到表中以及該字段是否為float類型
嗯?。∥颐髅鲗懙氖?23.456789,但是存儲到數(shù)據(jù)庫中卻變成了123.457,為什么會這樣呢?
原因我之前說過:float單精度類型,單精度數(shù)據(jù)類型存儲到表中容易被丟失。既然我們知道了原因,哪如何解決呢??方法就是用接下來要講的定點(diǎn)類型(DECIMAL)。
第四種:DECIMAL
DECIMAL可以防止數(shù)據(jù)jingd
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) # name = Column(String(20)) # price = Column(Float) price = Column(DECIMAL(7,3))
DECIMAL有兩個參數(shù),第一個參數(shù)用于指定一共多少位數(shù),第二個參數(shù)用于指定小數(shù)點(diǎn)后最多多少位數(shù)
例如:DECIMAL(4,2)表示一共存儲4位數(shù)字,小數(shù)點(diǎn)后最多有兩位
如果傳入不符合規(guī)則數(shù)值時會報如下錯誤:
所以我們在插入數(shù)據(jù)時一定要遵守參數(shù)規(guī)則
p = Person(price = 1234.567) session.add(p) session.commit()
運(yùn)行上述代碼,然后輸入下方命令檢查數(shù)據(jù)是否插入到表中以及該字段是否為decimal類型
第五種:Boolean
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) # name = Column(String(20)) # price = Column(Float) # price = Column(DECIMAL(7,3)) delete = Column(Boolean)
插入數(shù)據(jù)試試。我們知道,1代表true,0代表false
p = Person(delete = 1) session.add(p) session.commit()
運(yùn)行上述代碼,然后輸入下方命令檢查數(shù)據(jù)是否插入到表中(存儲到數(shù)據(jù)庫中對應(yīng)tinyint類型)
第六種:Enum
什么情況下會用到枚舉類型呢?比如用戶填寫性別時,固定只能選男或者女,不可能不男不女,對吧!
Enum()括號中為枚舉列表,在這個里面可以羅列出可輸入的值!
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) # name = Column(String(20)) # price = Column(Float) # price = Column(DECIMAL(7,3)) # delete = Column(Boolean) sex = Column(Enum("男","女"))
我們先插入一條錯誤數(shù)據(jù)試試
p = Person(sex="不男不女") session.add(p) session.commit()
運(yùn)行代碼、結(jié)果報如下錯誤:
我們再輸入一條正確數(shù)據(jù)試試
嗯,數(shù)據(jù)成功插入到表中,且數(shù)據(jù)類型為enum。
第七種:Date
Date只能存儲指定的年月日,不能存儲時分秒
說到日期類型,相信大家都熟悉,比如某年某月某日生。嗯、下面咱們就談?wù)勥@個Date類型。
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) # name = Column(String(20)) # price = Column(Float) # price = Column(DECIMAL(7,3)) # delete = Column(Boolean) # sex = Column(Enum("男","女")) create_time = Column(Date)
然后從datetime導(dǎo)入datetime這個包,將數(shù)據(jù)添加至數(shù)據(jù)庫
from datetime import datetime p = Person(create_time = datetime(2018,8,8)) session.add(p) session.commit()
datetime()中的數(shù)值用于傳遞指定的年月日
運(yùn)行并查看數(shù)據(jù)結(jié)果如下:
第八種:DateTime
DateTime存儲指定的年月日時分秒
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) # name = Column(String(20)) # price = Column(Float) # price = Column(DECIMAL(7,3)) # delete = Column(Boolean) # sex = Column(Enum("男","女")) # create_time = Column(Date) create_time = Column(DateTime)
添加測試數(shù)據(jù)
p = Person(create_time = datetime(2018,8,8,16,11,50)) session.add(p) session.commit()
datetime()括號中傳遞指定的年月日時分秒
運(yùn)行并查看數(shù)據(jù)結(jié)果如下:
第九種:Time
Time只能存儲時分秒,不能存儲年月日
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) # name = Column(String(20)) # price = Column(Float) # price = Column(DECIMAL(7,3)) # delete = Column(Boolean) # sex = Column(Enum("男","女")) # create_time = Column(Date) # create_time = Column(DateTime) create_time = Column(Time)
插入測試數(shù)據(jù),time()后面?zhèn)鬟f關(guān)鍵字參數(shù),用于指定時分秒
from datetime import datetime,time p = Person(create_time=time(hour=12,minute=20,second=50)) session.add(p) session.commit()
運(yùn)行并查看結(jié)果:
第十種:Text
這個沒什么好講的啊,當(dāng)字符串長度比較長時就可以使用Text類型
class Person(Base): __tablename__ = "person" id = Column(Integer , primary_key=True , autoincrement=True) # age = Column(Integer) # name = Column(String(20)) # price = Column(Float) # price = Column(DECIMAL(7,3)) # delete = Column(Boolean) # sex = Column(Enum("男","女")) # create_time = Column(Date) # create_time = Column(DateTime) # create_time = Column(Time) content = Column(Text)
插入數(shù)據(jù):
p = Person(content = "人最需要的是學(xué)習(xí)") session.add(p) session.commit()
運(yùn)行并查看結(jié)果:
第十一種:LongText
由于Text的存儲長度有限,我們就可以使用LongText來存儲數(shù)據(jù)。
由于LongText類型在mysql數(shù)據(jù)庫才有,其它數(shù)據(jù)庫沒有該數(shù)據(jù)類型,在使用前,記得從mysql數(shù)據(jù)庫導(dǎo)入該數(shù)據(jù)類型
from sqlalchemy.dialects.mysql import LONGTEXT
插入數(shù)據(jù):
p = Person(content = "我要給它做廣告,讓它在人群中最閃耀!") session.add(p) session.commit()
運(yùn)行上述代碼并查看結(jié)果:
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換
經(jīng)常會遇到圖片格式需要轉(zhuǎn)換的情況,這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì)、實(shí)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08Python socket連接中的粘包、精確傳輸問題實(shí)例分析
這篇文章主要介紹了Python socket連接中的粘包、精確傳輸問題,結(jié)合實(shí)例形式分析了Python socket連接中的粘包、精確傳輸相關(guān)問題原因、解決方案與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03Python-OpenCV實(shí)戰(zhàn):利用 KNN 算法識別手寫數(shù)字
K-最近鄰(KNN)是監(jiān)督學(xué)習(xí)中最簡單的算法之一,KNN可用于分類和回歸問題。本文將為大家介紹的是通過KNN算法實(shí)現(xiàn)識別手寫數(shù)字。文中的示例代碼介紹詳細(xì),需要的朋友可以參考一下2021-12-12typing.Dict和Dict的區(qū)別及它們在Python中的用途小結(jié)
當(dāng)在 Python 函數(shù)中聲明一個 dictionary 作為參數(shù)時,我們一般會把 key 和 value 的數(shù)據(jù)類型聲明為全局變量,而不是局部變量。,這篇文章主要介紹了typing.Dict和Dict的區(qū)別及它們在Python中的用途小結(jié),需要的朋友可以參考下2023-06-06人工神經(jīng)網(wǎng)絡(luò)算法知識點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家分享了人工神經(jīng)網(wǎng)絡(luò)算法的相關(guān)知識點(diǎn)以及原理介紹,需要的朋友們參考下。2019-06-06