app_query.append用法

本文深入探讨了在项目中使用app_query.append进行SQL查询时遇到的问题,特别是当where语句长度超过2000字节时引发的错误。文章详细解释了app_query.append和reset函数的作用,提供了查询前缀添加、查询外键添加等实用技巧,并通过实例代码展示了如何正确使用这些函数避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://ema100.blog.sohu.com/159959424.html

在项目在对某个form错误检查时候发现,当使用app_query.append时候,查询记录到一定数量时候会报错:数字或值错误。后来在matalink上查找之后发现原来用 app_query.append时候,where语句里面字节必须《2000,当大于这个字节数就会发生溢出。

因此顺便看了一下app_query里面的一些函数,做了如下笔记。
app_query.append ('块名',user_where_clause):  在form中,给数据块查询添加新的where语句。
      e.g:  在pre-query中添加 app_query.append('ORDER', 'oe_order_headers_v.order_type_id <> 1'); 在查询时候限定类型不为一
app_query.reset('块名'): 第一次设置查询条件为 default_where.在form中由于有安全性的控制,在使用 app_query.append  的时候会限制用户添加的where语句长度《=2000字节,一旦超出2000,则出现溢出,会报错:数字或者字符出错,找不到数据......,因此在使用app_query.append之前需要使用 app_query.reset把where语句重置
app_query.query_foreign_key(block_name         VARCHAR2,
                              db_field           VARCHAR2,
                              non_db_field       VARCHAR2,
                              table_name         VARCHAR2,
                              id_column          VARCHAR2,
                              name_column        VARCHAR2,
                              extra_where_clause VARCHAR2 DEFAULT NULL): 用来给数据库对应的视图中的非数据库项添加子查询
  例如:app_query.query_foreign_key('GROUPS', 'APPLICATION_ID', 'APPLICATION_NAME','FND_APPLICATION_VL', 'APPLICATION_ID', 'APPLICATION_NAME');
    添加这样的语句之后,查询会增加:application_id  in (select 'APPLICATION from FND_APPLICATION_VL where APPLICATION_NAME =groups.application_name || extra_where_clause ) 

FUNCTION join(clause1 VARCHAR2,
                clause2 VARCHAR2) : 连接两个where语句,返回 clause1 and clause2 

# -*- coding: utf-8 -*- """ @file: ledger @author: zhangxiukun @date: 2025/7/9 14:10 """ from io import BytesIO from typing import List from fastapi import APIRouter, Query, File, UploadFile, HTTPException from tortoise.expressions import Q from app.api.v1.utils import insert_log from app.controllers import user_controller from app.controllers.changeledger import changeledger_controller from app.core.ctx import CTX_USER_ID from app.models.system import LogType, LogDetailType from app.schemas.base import SuccessExtra, Success from app.schemas.changeledger import ChangeLedgerSearch, ChangeLedgerCreate, ChangeLedgerUpdate from tortoise.queryset import QuerySet try: from app.settings import APP_SETTINGS except ImportError: raise SettingNotFound("Can not import settings") router = APIRouter() @router.post("/ledgers/all", summary="查看变更列表") async def _(obj_in: ChangeLedgerSearch): q = Q() if obj_in.source: q &= Q(source=obj_in.source) if obj_in.peco: q &= Q(peco__contains=obj_in.peco) if obj_in.projectno: q &= Q(projectno__contains=obj_in.projectno) if obj_in.can_upgrade: q &= Q(can_upgrade=obj_in.can_upgrade) if obj_in.dept: q &= Q(dept__contains=obj_in.dept) if obj_in.software_change: q &= Q(software_change=obj_in.software_change) user_id = CTX_USER_ID.get() user_obj = await user_controller.get(id=user_id) total, api_objs = await changeledger_controller.list(page=obj_in.current, page_size=obj_in.size, search=q, order=["peco", "id"]) records = [] hwswco_url=APP_SETTINGS.ZENTAO_HWSWCO hwswco_upgrade_url=APP_SETTINGS.ZENTAO_HWSWCO_UPGRADE for obj in api_objs: data = await obj.to_dict(exclude_fields=[]) data.update({ "hwswco_url": hwswco_url, "hwswco_upgrade_url":hwswco_upgrade_url, }) records.append(data) print(records,111) data = {"records": records} await insert_log(log_type=LogType.UserLog, log_detail_type=LogDetailType.ChangeLedgerList, by_user_id=user_obj.id) return SuccessExtra(data=data, total=total, current=obj_in.current, size=obj_in.size) 当搜索 "canUpgrade": "0"时,得到了所有数据
最新发布
07-31
from typing import List from fastapi import APIRouter, Query, File, UploadFile from tortoise.expressions import Q from app.api.v1.utils import insert_log from app.controllers import user_controller from app.controllers.interlockledger import interlockledger_controller from app.core.ctx import CTX_USER_ID from app.models.system import LogType, LogDetailType from app.models.interlock import InterLockLedger from app.schemas.base import SuccessExtra, Success from app.schemas.interlockledger import InterLockLedgerSearch, InterLockLedgerCreate, InterLockLedgerUpdate router = APIRouter() @router.post("/ledgers/all", summary="查看互锁台账列表") async def _(obj_in: InterLockLedgerSearch): q = Q() if obj_in.alarm_name: q &= Q(alarm_name__contains=obj_in.alarm_name) if obj_in.product: q &= Q(product__contains=obj_in.product) if obj_in.lock_type: q &= Q(lock_type=obj_in.lock_type) if obj_in.module_name: q &= Q(module_name__contains=obj_in.module_name) if obj_in.alarm_level: q &= Q(alarm_level=obj_in.alarm_level) user_id = CTX_USER_ID.get() user_obj = await user_controller.get(id=user_id) total, api_objs = await interlockledger_controller.list(page=obj_in.current, page_size=obj_in.size, search=q, order=["alarm_name", "id"]) records = [] for obj in api_objs: data = await obj.to_dict(exclude_fields=[]) records.append(data) data = {"records": records} await insert_log(log_type=LogType.UserLog, log_detail_type=LogDetailType.InterLockLedgerList, by_user_id=user_obj.id) return SuccessExtra(data=data, total=0, current=obj_in.current, size=obj_in.size) @router.post(path='/ledgers', summary='创建互锁台账记录') async def _(obj_in: InterLockLedgerCreate): # 互锁台账记录创建接口 new_ledger = await interlockledger_controller.create(obj_in=obj_in) await insert_log(log_type=LogType.UserLog, log_detail_type=LogDetailType.InterLockLedgerCreate, by_user_id=0) return Success(msg='Create Successfully', data={"create_id": new_ledger.id}) @router.patch(path='/ledgers/{ledger_id}', summary='更新互锁台账记录') async def _(ledger_id: int, obj_in: InterLockLedgerUpdate): await interlockledger_controller.update(id=ledger_id, obj_in=obj_in) await insert_log(log_type=LogType.UserLog, log_detail_type=LogDetailType.InterLockLedgerUpdate, by_user_id=0) return Success(msg="Updated Successfully", data={"updated_id": ledger_id}) @router.delete(path='/ledgers/{ledger_id}', summary='删除互锁台账记录') async def _(ledger_id: int): await interlockledger_controller.remove(id=ledger_id) await insert_log(log_type=LogType.UserLog, log_detail_type=LogDetailType.InterLockLedgerDelete, by_user_id=0) return Success(msg="Deleted Successfully", data={"deleted_id": ledger_id}) @router.delete(path='/ledgers', description='批量删除互锁台账记录') async def _(ids: str = Query(..., description='互锁台账ID列表,用逗号隔开')): ledger_ids = ids.split(",") deleted_ids = [] print('删除互锁台账id记录') for ledger_id in ledger_ids: ledger_obj = await InterLockLedger.get(id=int(ledger_id)) await ledger_obj.delete() deleted_ids.append(int(ledger_id)) await insert_log(log_type=LogType.UserLog, log_detail_type=LogDetailType.InterLockLedgerBatchDelete, by_user_id=0) return Success(msg="Deleted Successfully", data={"deleted_ids": deleted_ids}) @router.post(path='/ledgers/upload', description='互锁台账上传') async def _(files: List[UploadFile] = File(...)): print('互锁台账上传逻辑') for file in files: print(file.filename) return Success(msg="Upload Successfully", data={}) 写一个下载接口,将前端选中的行下载为一个excel文件
07-13
import sys import json from PyQt5.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QTextEdit, QLineEdit, QPushButton, QLabel, QSplitter, QListWidget, QStatusBar, QMessageBox ) from PyQt5.QtGui import QFont, QPalette, QColor, QTextCursor from PyQt5.QtCore import Qt, QThread, pyqtSignal import requests import base64 import hmac import hashlib import urllib.parse from datetime import datetime, timezone # 火山引擎 API 配置 API_URL = "https://open.volcengineapi.com/api/v3/chat/completions?Action=Chat&Version=2023-08-01" ACCESS_KEY = "AKLTMjA2YWNlYmIwNDAyNGMxOThkMjBkNTQxNjEwMmFhNzA" SECRET_KEY = "TmpJeU9XTTVaVEUwTlROak5HWmhaamcyTldZNVpqVTFaR1kxWXpZek5HVQ==" class VolcEngineWorker(QThread): """后台线程处理火山引擎 API 调用""" response_received = pyqtSignal(str, bool) # 信号:回复内容, 是否错误 status_update = pyqtSignal(str) # 状态更新信号 def __init__(self, prompt, parent=None): super().__init__(parent) self.prompt = prompt def run(self): """线程主函数""" try: self.status_update.emit("正在生成回复...") response = self.call_volcengine_api(self.prompt) self.response_received.emit(response, False) except Exception as e: self.response_received.emit(f"错误: {str(e)}", True) def generate_signature(self, secret_key, method, path, query_params, date): """生成火山引擎 API 签名""" sorted_keys = sorted(query_params.keys()) canonical_query = "&".join( f"{urllib.parse.quote(k, safe='')}={urllib.parse.quote([0], safe='')}" for k in sorted_keys ) signature_origin = ( f"{method} {path} HTTP/1.1\n" f"Host: open.volcengineapi.com\n" f"Date: {date}\n" f"{canonical_query}" ) decoded_secret = base64.b64decode(secret_key) signature = hmac.new( decoded_secret, signature_origin.encode('utf-8'), hashlib.sha256 ).digest() return base64.b64encode(signature).decode() def call_volcengine_api(self, prompt): """调用火山引擎聊天 API""" messages = [ {"role": "system", "content": "你是有帮助的助手"}, {"role": "user", "content": prompt} ] request_data = { "messages": messages, "parameters": { "model": "skylark-lite-public", "temperature": 0.5, "max_tokens": 1024 } } date = datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S GMT") parsed_url = urllib.parse.urlparse(API_URL) query_params = urllib.parse.parse_qs(parsed_url.query) signature = self.generate_signature( SECRET_KEY, "POST", parsed_url.path, query_params, date ) auth_data = { "access_key": ACCESS_KEY, "algorithm": "HMAC-SHA256", "headers": "host date", "signature": signature } authorization = base64.b64encode(json.dumps(auth_data).encode()).decode() headers = { "Authorization": authorization, "Date": date, "Host": "open.volcengineapi.com", "Content-Type": "application/json" } response = requests.post( API_URL, headers=headers, json=request_data, timeout=30 ) if response.status_code == 200: data = response.json() return data.get("choices", [{}])[0].get("message", {}).get("content", "") else: return f"API请求失败: {response.status_code} - {response.text}" class ChatApplication(QMainWindow): """火山引擎聊天应用主界面""" def __init__(self): super().__init__() self.init_ui() self.setWindowTitle("火山引擎聊天助手") self.resize(800, 600) # 聊天历史 self.chat_history = [] def init_ui(self): """初始化用户界面""" # 主窗口部件 central_widget = QWidget() self.setCentralWidget(central_widget) main_layout = QVBoxLayout(central_widget) # 分割布局 splitter = QSplitter(Qt.Horizontal) main_layout.addWidget(splitter) # 左侧面板 - 聊天历史 left_panel = QWidget() left_layout = QVBoxLayout(left_panel) left_layout.setContentsMargins(0, 0, 0, 0) history_label = QLabel("聊天历史") history_label.setFont(QFont("Arial", 10, QFont.Bold)) history_label.setStyleSheet("padding: 5px; background: #f0f0f0;") left_layout.addWidget(history_label) self.history_list = QListWidget() self.history_list.setStyleSheet(""" QListWidget { background-color: #f8f8f8; border: none; } QListWidget::item { padding: 8px; border-bottom: 1px solid #e0e0e0; } QListWidget::item:selected { background-color: #e0f0ff; } """) self.history_list.itemClicked.connect(self.load_chat_history) left_layout.addWidget(self.history_list) splitter.addWidget(left_panel) # 右侧面板 - 聊天区域 right_panel = QWidget() right_layout = QVBoxLayout(right_panel) right_layout.setContentsMargins(0, 0, 0, 0) # 聊天显示区域 self.chat_display = QTextEdit() self.chat_display.setReadOnly(True) self.chat_display.setStyleSheet(""" QTextEdit { background-color: #ffffff; border: none; padding: 10px; font-size: 14px; } """) self.chat_display.setFont(QFont("Arial", 12)) right_layout.addWidget(self.chat_display) # 输入区域 input_layout = QHBoxLayout() self.input_field = QLineEdit() self.input_field.setPlaceholderText("输入消息...") self.input_field.setStyleSheet(""" QLineEdit { padding: 10px; border: 1px solid #ccc; border-radius: 4px; font-size: 14px; } """) self.input_field.returnPressed.connect(self.send_message) input_layout.addWidget(self.input_field) self.send_button = QPushButton("发送") self.send_button.setStyleSheet(""" QPushButton { background-color: #4a90e2; color: white; padding: 10px 20px; border: none; border-radius: 4px; font-weight: bold; } QPushButton:hover { background-color: #3a7bc8; } QPushButton:disabled { background-color: #cccccc; } """) self.send_button.clicked.connect(self.send_message) input_layout.addWidget(self.send_button) right_layout.addLayout(input_layout) splitter.addWidget(right_panel) # 设置分割比例 splitter.setSizes([200, 600]) # 状态栏 self.status_bar = QStatusBar() self.setStatusBar(self.status_bar) self.status_bar.showMessage("就绪") # 添加初始消息 self.add_message("系统", "欢迎使用火山引擎聊天助手!请输入您的问题开始对话。", False) def add_message(self, sender, message, is_user=True): """添加消息到聊天显示区域""" # 格式化消息 if is_user: html = f""" <div style="margin: 10px 0; text-align: right;"> <div style="font-weight: bold; color: #2c3e50;">{sender}</div> <div style="background-color: #e3f2fd; border-radius: 10px; padding: 10px; display: inline-block; max-width: 80%; text-align: left; border: 1px solid #bbdefb;"> {message} </div> </div> """ else: html = f""" <div style="margin: 10px 0;"> <div style="font-weight: bold; color: #2c3e50;">{sender}</div> <div style="background-color: #f5f5f5; border-radius: 10px; padding: 10px; display: inline-block; max-width: 80%; border: 1px solid #e0e0e0;"> {message} </div> </div> """ # 添加消息到聊天显示区域 self.chat_display.append(html) self.chat_display.moveCursor(QTextCursor.End) # 添加到聊天历史 self.chat_display.append({"sender": sender, "message": message, "is_user": is_user}) def send_message(self): """发送用户消息""" message = self.input_field.text().strip() if not message: return # 添加用户消息 self.add_message("您", message, True) # 清空输入框 self.input_field.clear() # 禁用发送按钮 self.send_button.setEnabled(False) self.input_field.setEnabled(False) # 创建并启动工作线程 self.worker = VolcEngineWorker(message) self.worker.response_received.connect(self.handle_api_response) self.worker.status_update.connect(self.status_bar.showMessage) self.worker.start() def handle_api_response(self, response, is_error): """处理 API 响应""" # 启用发送按钮 self.send_button.setEnabled(True) self.input_field.setEnabled(True) if is_error: self.add_message("系统", response, False) QMessageBox.critical(self, "错误", f"发生错误: {response}") else: self.add_message("火山引擎", response, False) # 添加到历史列表 self.history_list.addItem(f"对话 {len(self.chat_history) // 2 + 1}") self.status_bar.showMessage("就绪") def load_chat_history(self, item): """加载选中的聊天历史""" index = self.history_list.row(item) # 计算在历史记录中的位置 start_index = index * 2 # 每个对话包含2条消息 # 清空当前聊天显示 self.chat_display.clear() # 添加初始欢迎消息 self.chat_display.append(""" <div style="margin: 10px 0;"> <div style="font-weight: bold; color: #2c3e50;">系统</div> <div style="background-color: #f5f5f5; border-radius: 10px; padding: 10px; display: inline-block; max-width: 80%; border: 1px solid #e0e0e0;"> 欢迎使用火山引擎聊天助手!以下是您选择的对话历史。 </div> </div> """) # 添加选中的历史消息 for i in range(start_index, start_index + 2): if i < len(self.chat_history): msg = self.chat_history[i] self.add_message(msg["sender"], msg["message"], msg["is_user"]) if __name__ == "__main__": app = QApplication(sys.argv) # 设置应用样式 app.setStyle("Fusion") palette = QPalette() palette.setColor(QPalette.Window, QColor(240, 240, 240)) palette.setColor(QPalette.WindowText, QColor(0, 0, 0)) app.setPalette(palette) window = ChatApplication() window.show() sys.exit(app.exec_()) append(self, text: Optional[str]): argument 1 has unexpected type 'dict'
07-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值