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: 長文本類型
- 建立base類
- 簡單的增刪改查
- 增
-
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()
- 增