同時提交多條數據注意事項
1.在一個Session中可提交多條數據(包括增刪改查,每條增刪改查語句需加上db.Session.flush()語句)
2.不可在一個Session執行完畢前提前終止,中斷【注意:Sesion中調用的其他方法中也會中斷Session繼續執行】
sqlalchemy對象:
from sqlalchemy import Column
from sqlalchemy import DateTime
from sqlalchemy import BIGINT
from sqlalchemy import INTEGER
from sqlalchemy import String
from db_manager import TTDModel
class CertTB(TTDModel):
"""
證書表
"""
__tablename__ = 'cert_info'
uuid = Column(BIGINT, primary_key=True)
create_user_name = Column(String(255), default=None) #
create_user_uuid = Column(BIGINT, default=None) #
file_paths = Column(String(255), default=None) #
file_ids = Column(String(255), default=None) #
cert_no = Column(String(255), default=None) #
cert_type = Column(INTEGER, default=None) # 1:t1 2:t2
validity_start_time = Column(DateTime, default=None) #
validity_end_time = Column(DateTime, default=None) #
def __init__(self):
self.__table__ = None
def get_columns(self):
return [col.name for col in self.__table__.columns]
def to_dict(self):
return dict([(col, getattr(self, col)) for col in self.get_columns()])
db:
engine = create_engine(DB_URI,
pool_size=100,
max_overflow=0,
pool_timeout=60, # 超時時間
pool_pre_ping=True) # 從連接池獲取連接之前檢查有效性
Session = sessionmaker(bind=engine)
db = Session()
1.添加/新增
# 獲取用戶的請求參數
cType = request.form['cType']
cNo = request.form['cNo']
startDate = request.form['startDate']
endDate = request.form['endDate']
filePaths = request.form.get("filePaths");
if filePaths:
filePaths = request.form['filePaths']
#組裝對象數據
cert = CertTB()
cert.cert_no = cNo
cert.cert_type = cType
if filePaths:
cert.file_paths = filePaths
cert.validity_start_time = date_format.get_date_str_ymdhms(startDate)
cert.validity_end_time = date_format.get_date_str_ymdhms(endDate)
db.add(cert) # 添加對象數據到數據庫
db.commit() # 提交
db.close() # 關閉數據庫連接
2 更新
①查詢結果直接更新
db.query(Certificate) \ #查詢證書
.filter(Certificate.uuid == cert_id) \ # 查詢條件
.update({Certificate.cNumber: cert_code, # “:”後面部分是更新後的值
Certificate.operationCer: cert_type,
Certificate.startDate: approve_date,
Certificate.cExpireDate: end_date})
db.flush()
②查詢結果,更新結果,提交
uuid = request.form['certId']
cType = request.form['cType']
cNo = request.form['cNo']
startDate = request.form['startDate']
endDate = request.form['endDate']
filePaths = request.form.get("filePaths");
if filePaths:
filePaths = request.form['filePaths']
cert = db.query(CertTB).filter(CertTB.uuid == uuid).first()
if not cert:
return make_api_respone(201, '未找到相關技工認證證書', {}, None)
cert.cert_no = cNo
cert.cert_type = cType
if filePaths:
cert.file_paths = filePaths
cert.validity_start_time = startDate # 設置新數據
cert.validity_end_time = endDate # 設置新數據
db.commit() # 提交更新
db.close()
3 刪除
db.query(CerAttachment).filter(CerAttachment.cerId == cert_id).delete() # 查詢並刪除
db.flush() # 處理
刪除多條數據[temp是一個元祖]
ev_qrs = db.query(EvQrCode).filter(EvQrCode.evId.in_(temp)).all()
# 刪除老的二維碼
if ev_qrs:
for item in ev_qrs:
db.delete(item)
db.commit()
注意:db.query(EvQrCode).filter(EvQrCode.evId.in_(temp)).delete()會報錯
4 查詢
單表查詢就不介紹了,這裏直接多表查詢,join操作【提示:join操作是一個費時操作,儘量少用】
hlog.info("查詢count")
count = db.query(EvInfo.uuid.label("evId"), EvInfo.evOrder, ProjectInfo.name, ProjectInfo.address) \
.filter(and_(ProjectInfo.city == city_id, ProjectInfo.name.like("%" + project_name + "%"))) \
.join(ProjectInfo, EvInfo.projectId == ProjectInfo.uuid) \
.count()
hlog.info("批量查詢電梯")
data = db.query(EvInfo.uuid.label("evId"), EvInfo.evOrder, ProjectInfo.name, ProjectInfo.address) \
.filter(and_(ProjectInfo.city == city_id, ProjectInfo.name.like("%" + project_name + "%"))) \
.join(ProjectInfo, EvInfo.projectId == ProjectInfo.uuid) \ # join 項目表
.limit(page_size) \ # page_size 分頁—每頁的數量
.offset((page_num - 1) * page_size) \ # page_num 當前頁數
.all()
下面這段代碼:查詢在CLocation中“不存在”的WoInfo
data = db.query(WoInfo.uuid.label("woId"), WoInfo.type.label('woType'), CElevator.evId, WoInfo.date) \
.filter(and_(WoInfo.userId == user_id, ~exists().where(CLocation.woId == WoInfo.uuid))) \
.join(CElevator, CElevator.woId == WoInfo.uuid) \
.limit(page_size) \
.offset((page - 1) * page_size) \
.all()