(轉)python之sqlalchemy詳解


原文: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個數據類型都有哪些?

  1. Integer:整型,映射到數據庫中是int類型。
  2. Float:浮點類型,映射到數據庫中是float類型。他占據的32位。
    浮點類型,有可能會造成精度丟失,特別是在money方面,不可原諒。
  3. Double(SQLAlchemy中沒有,代替品為DECIMAL):雙精度浮點類型,映射到數據庫中是double類型,占據64位
  4. String:可變字符類型,映射到數據庫中是varchar類型.
  5. Boolean:布爾類型,映射到數據庫中的是tinyint類型。
  6. DECIMAL:定點類型。是專門為了解決浮點類型精度丟失的問題的。在存儲money相關的字段的時候建議大家都使用這個數據類型。並且這個類型使用的時候需要傳遞兩個參數,第一個參數是用來標記這個字段總能能存儲多少個數字,第二個參數表示小數點后有多少位。
  7. Enum:枚舉類型。指定某個字段只能是枚舉中指定的幾個值,不能為其他值。在ORM模型中,使用Enum來作為枚舉。
  8. Date:存儲時間,只能存儲年月日。映射到數據庫中是date類型。在Python代碼中,可以使用datetime.date來指定。
  9. DateTime:存儲時間,可以存儲年月日時分秒毫秒等。映射到數據庫中也是datetime類型。在Python代碼中,可以使用datetime.datetime來指定。
  10. Time:存儲時間,可以存儲時分秒。映射到數據庫中也是time類型。在Python代碼中,可以使用datetime.time來指定
    ps:注意區分Date/DateTime/Time的儲存信息!!!
  11. Text:存儲長字符串。一般可以存儲6W多個字符
  12. 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) content2 = Column(LONGTEXT) # 將Base上的ORM類模型對應的數據表都刪除 # Base.metadata.drop_all() # 創建Base上的ORM類到數據庫中成為表 # Base.metadata.create_all() # 新增數據到表news中 session = sessionmaker(engine)() # 注意float出現的精度丟失問題 is_delete,布爾類型true:1,false:0 news1 = News(price1=1000.0078,price2=1000.0078,title='測試數據',is_delete=True,tag1="PYTHON",tag2=TagEnum.flask, create_time1=date(2018,12,12),create_time2=datetime(2019,2,20,12,12,30),create_time3=time(hour=11,minute=12,second=13),content1="hello",content2 ="hello hi nihao") session.add(news1) session.commit()

Column常用約束參數

在給數據庫表指定key的時候,必然要給它們添加,例如:不可空,字節長度等等的限制,這就需要約束參數的出場了。常用的約束參數一共有7種

常見約束參數

約束參數描述,功能primary_keyTrue設置某個字段為主鍵autoincrementTrue設置這個字段為自動增長的default設置某個字段的默認值。在發表時間這些字段上面經常用nullable指定某個字段是否為空。默認值是True,就是可以為空unique指定某個字段的值是否唯一。默認是False。onupdate在數據更新的時候會調用這個參數指定的值或者函數。在第一次插入這條數據的時候,不會用onupdate的值,只會使用default的值。常用於是update_time字段(每次更新數據的時候都要更新該字段值)。name指定ORM模型中某個屬性映射到表中的字段名。如果不指定,那么會使用這個屬性的名字來作為字段名。這個參數也可以當作位置參數,在第1個參數來指定。

代碼實現

# 注意千萬不能忘記要先創建session對象啊!! # 需求:sqlalchemy中Column常用的約束參數 class News(Base): __tablename__ = 'news' id = Column(Integer,primary_key=True,autoincrement=True) # 這個Datetime是sqlalchemy中的 create_time = Column(DateTime,default=datetime.now) read_count = Column(Integer,default=11) title1 = Column(String(50),name='my_title',nullable=False) title2 = Column('my_title22',String(50), nullable=False)# name 屬性的兩種方式 telephone = Column(String(11),unique=True) update_time = Column(DateTime,onupdate=datetime.now,default=datetime.now)#onupdate是在數據更新的時候才會起作用,插入數據時候不起作用 # Base.metadata.drop_all() # Base.metadata.create_all() news1 = News(title1 ='hahah',title2 = 'womingsad') session.add(news1) #結束之后,必須要提交 session.commit()

Query查詢函數,可以傳遞的參數有哪些?

Query查詢函數傳遞的參數無非就是分為三類,分別是模型名、模型中的屬性、聚合函數,那下面就簡單的說明,

模型名

指定查找該模型中所有屬性(對應查詢為全表查詢)

模型中的屬性

可以指定只查找某個模型的其中幾個屬性

聚合函數

聚合函數一共有五個,都被放到了sqlalchemy的func模塊中。
  1. func.count:統計行的數量
  2. func.avg:求平均值
  3. func.max:求最大值
  4. func.min:求最小值
  5. func.sum:求和

代碼實現

# 新增測試數據 for x in range(1,6): a = News(title = "標題%s"%x,price = random.randint(1,100)) session.add(a) # 提交 session.commit() # 三種參數 # 模型名 result = session.query(News).all() #全表查詢 print(result) # 模型名的屬性名,返回的列表中的元素是元組類型數據 result = session.query(News.title,News.price).all() print(result) # 聚合函數 # 統計行的數量 r = session.query(func.count(News.id)).first() print(r) #最大值 r = session.query(func.max(News.price)).first() print(r) #最小值 r = session.query(func.min(News.price)).first() print(r) #平均值 r = session.query(func.avg(News.price)).first() print(r) #求和 r = session.query(func.sum(News.price)).first() print(r)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM