tornado的ORM


tornado的ORM

 


  • 安裝sqlalchemy和pymysql
    • pip install sqlalchemy
    • pip install pymysql
  • 連接數據庫
    •  1 from sqlalchemy import create_engine
       2 
       3 
       4 
       5 config = {
       6     'HOST': '',
       7     'USERNAME': '',
       8     'PASSWORD': '',
       9     'PORT': '',
      10     'DATABASE': '',
      11     'PARAMS': ''
      12 }
      13 
      14 
      15 DB_URL = 'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}?{PARAMS}'
      16 
      17 engine = create_engine(DB_URL.format(**config))
      18 
      19 
      20 
      21 if __name__ == '__main__':
      22     conc = engine.connect()
      23     result = conc.execute('select 1')
      24     print(result.fetchone())

      如果連接成功,則控制台會出現(1,)的結果


  • 數據庫建模
    • 建立base類
       1 from sqlalchemy import create_engine
       2 from sqlalchemy.ext.declarative import declarative_base
       3 
       4 
       5 config = {
       6     'HOST': '',
       7     'USERNAME': '',
       8     'PASSWORD': '',
       9     'PORT': '',
      10     'DATABASE': '',
      11     'PARAMS': ''
      12 }
      13 
      14 
      15 DB_URL = 'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}?{PARAMS}'
      16 
      17 engine = create_engine(DB_URL.format(**config))
      18 
      19 Base = declarative_base(engine)
    • 使用base類並建立表格
       1 from settings import Base
       2 from sqlalchemy import Column, Integer, String, DateTime, Boolean
       3 from datetime import datetime
       4 
       5 
       6 class User(Base):
       7     __tablename__ = 'user'  # 指定表名
       8     id = Column(Integer, autoincrement=True, primary_key=True)
       9     username = Column(String(20))
      10     password = Column(String(20))
      11     create_time = Column(DateTime, default=datetime.now())
      12     is_login = Column(Boolean, default=False, nullable=False)
      13 
      14 
      15 
      16 
      17 if __name__ == '__main__':
      18     Base.metadata.create_all()  # 創建表格

      創建的表名必須為該類的__tablename__屬性,Colum新建一個字段,然后給Colum傳參來進行約束

    • Column的常用參數:
      • default: 默認值,可以傳一個函數體,default的值等於這個函數體執行后返回的值
      • nullable:是否可為空
      • primary_key:是否為主鍵
      • unique: 是否唯一
      • autoincrement: 是否自增長
      • onupdate: 更新的時候執行的函數,和default一樣,可以傳一個函數體
      • name: 該屬性在數據庫中的字段的映射,默認是屬性名 
    • 常用的數據類型
      • Integer: 整形
      • Float: 浮點類型
      • Boolean:布爾
      • DECIMAL: 定點類型: DECIMAL第一個參數為整數位的個數,第二位參數為小數位的個數
      • Enum:枚舉類型: Enum可以借助python3自帶的enum包來實現更加簡便
      • Date: 傳遞datetime.date()
      • DateTime: 傳遞datetime.datetime()
      • Time:傳遞datetime.time() 進去
      • String: 字符串型, 使用時需要制定長度
      • Text: 文本類型
      • LONGTEXT: 長文本類型
  • 簡單的增刪改查
      •  1 from sqlalchemy import create_engine
         2 from settings import DB_CONFIG
         3 from sqlalchemy.ext.declarative import declarative_base
         4 from sqlalchemy.orm import sessionmaker
         5 
         6 
         7 DB_URL = 'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}?{PARAMS}'
         8 
         9 engine = create_engine(DB_URL.format(**DB_CONFIG))
        10 
        11 Base = declarative_base(engine)
        12 
        13 Session = sessionmaker(engine)
        14 
        15 session = Session()

        與上面不同的是,新建了一個Session對象,然后將這個對象實例化,接下來的數據庫操作都用到這個實例對象來操作

      •  1 from config import Base
         2 from sqlalchemy import Column, Integer, String, DateTime, Boolean
         3 from datetime import datetime
         4 
         5 class User(Base):
         6     __tablename__ = 'user'
         7     id = Column(Integer, primary_key=True, autoincrement=True)
         8     username = Column(String(20))
         9     password = Column(String(20))
        10     create_time = Column(DateTime, default=datetime.now())
        11     is_login = Column(Boolean, default=False, nullable=False)
        12 
        13

        表結構

      •  1 from wechat import User
         2 from config import session
         3 
         4 def add():
         5     user = User(username='ivy', password='123456')
         6     session.add(user)
         7     session.commit()
         8 
         9 
        10 if __name__ == '__main__':
        11     add()

        添加一條

      •  1 from wechat import User
         2 from config import session
         3 
         4 def add():
         5 
         6     session.add_all([
         7         User(username='ivy', password='123456'),
         8         User(username='ivy1', password='123456'),
         9         User(username='ivy2', password='123456'),
        10     ])
        11     session.commit()
        12 
        13 
        14 if __name__ == '__main__':
        15     add()

        添加多條

      •  1 from wechat import User
         2 from config import session
         3 
         4 def search():
         5     session.query(User).all()  # 查找所有
         6     result = session.query(User).first().username  # 查找第一個
         7     result = session.query(User).filter(User.username=='ivy').first().password
         8     print(result)
         9 
        10 
        11 
        12 if __name__ == '__main__':
        13     search()
      •  1 from wechat import User
         2 from config import session
         3 
         4 
         5 def update():
         6     session.query(User).filter(User.username == 'ivy').update(
         7         {
         8             User.username: 'bob',
         9             User.password: '123654',
        10         }
        11     )
        12     session.commit()
        13 
        14 
        15 if __name__ == '__main__':
        16     update()

        更改的數據以字典的鍵值對的形式傳入

      •  1 from wechat import User
         2 from config import session
         3 
         4 
         5 def delete():
         6     result = session.query(User).filter(User.username == 'bob').first()
         7 
         8     session.delete(result)
         9     session.commit()
        10 
        11 
        12 if __name__ == '__main__':
        13     delete()

        先查詢結果,再講查詢的結果刪除,如果查詢的結果為空,則刪除會報錯。

    •  每個session執行完畢之后都要close()

 


免責聲明!

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



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