if sa_url.drivername.startswith('mysql'): AttributeError: 'NoneType' object has no attribute 'driver

本文分享了在使用Flask框架进行数据库初始化时遇到的错误及解决方案。作者发现数据库对象为None,通过将数据库URL从环境变量直接写入代码中,成功解决了问题并创建了数据库表。

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

在这里插入图片描述
在使用Flask的时候新建数据库报了这个错误,上网查了感觉好像是因为数据库对象为None,也就是这里
在这里插入图片描述
因为之前把数据库的URL放到环境变量里面了,但是不知道为什么这里没有获取到,然后尝试了下把数据库URL信息添加上去,就像这样
在这里插入图片描述
然后再尝试
在这里插入图片描述
成功,并且数据库中也有创建的表
在这里插入图片描述

import requests import json from datetime import datetime from 获取div中所有p标签 import get_order_manage_detail from 手机号 import get_passenger_mobile def get_cancelled_orders(driver_name=None, cookie_path='cookie1.txt'): """ 查询指定司机的取消订单 参数: driver_name: str - 司机姓名(可选),不传则查询所有司机 cookie_path: str - cookie文件路径,默认为'cookie.txt' 返回: list - 格式化后的取消订单信息列表 """ def get_cookie_value(cookies, cookie_name): """从cookie列表中提取指定cookie的值""" for cookie in cookies: if cookie['name'] == cookie_name: return cookie['value'] return None def parse_order_detail(order_detail_data): """ 解析订单详情数据,提取关键信息 参数: order_detail_data: dict - 订单详情数据 返回: str - 格式化后的订单信息 """ try: if 'error' in order_detail_data: return f"获取订单详情失败: {order_detail_data['error']}" if order_detail_data.get('code') != 1: return f"API返回错误: {order_detail_data.get('msg', '未知错误')}" data = order_detail_data.get('data', {}) if not data: return "订单详情数据为空" # 提取基本信息 order_base = data.get('orderBaseInfoVO', {}) order_price = data.get('orderPriceVO', {}) states = data.get('states', []) # 司机信息 driver_name = "未知司机" plate_no = "无车牌" driver_mobile = "未知" if states: latest_state = states[-1] # 获取最新状态 driver_name = latest_state.get('driverName', '未知司机') plate_no = latest_state.get('plateNo', '无车牌').replace('*', '') driver_mobile = latest_state.get('driverMobile', '未知') # 乘客信息 passenger_mobile = order_base.get('passengerMobile', '未知') agent_passenger_mobile = order_base.get('agentPassengerMobile', '未知') # 时间信息 create_time = order_base.get('passengerCreateDate', 0) if create_time: from datetime import datetime create_datetime = datetime.fromtimestamp(create_time / 1000) date_str = create_datetime.strftime('%Y-%m-%d') time_str = create_datetime.strftime('%H:%M:%S') else: date_str = "未知日期" time_str = "未知时间" # 车型信息 car_type = order_base.get('orderCategoryTypeName', '未知车型') standard_type = order_base.get('standardUseCarTypeName', '') if standard_type: car_type = f"{car_type}-{standard_type}" # 地址信息 start_point = order_base.get('orderStartPoint', {}) end_point = order_base.get('orderEndPoint', {}) start_address = start_point.get('address', '未知起点').replace('*******', '') end_address = end_point.get('address', '未知终点').replace('*******', '') # 价格信息 trip_price = order_price.get('tripPrice', '0.00') estimate_price = order_price.get('estimatePrice', 0) # 里程和时长 estimate_mileage = order_base.get('estimateMileage', 0) / 1000 # 转换为公里 estimate_duration = order_base.get('estimateDuration', 0) # 渠道信息 channel = order_base.get('standardSourceName', '未知渠道') # 获取orderId order_id = order_base.get('orderId') or order_base.get('etravelOrderId') # 获取driverId driver_id = order_base.get('driverId') # 如果两个值都存在,添加到结果列表 if order_id and driver_id: p = get_passenger_mobile("cookie1.txt", driver_id, order_id) # return f"""司机:{driver}({plate}) s = p # 格式化输出 result = f"""司机:{driver_name}({plate_no}) 暗号:{s} 用车时间:{date_str} {time_str} 用车车型:{car_type} 起点:{start_address} 终点:{end_address} 特惠一口价:{trip_price}元 预估价格:{estimate_price}元 预估里程:{estimate_mileage}km 预估时长:{estimate_duration}分钟 该笔订单来自{channel}""" return result except Exception as e: return f"解析订单详情时发生错误: {str(e)}" # def format_order(order,cookie_name): # # 司机信息 # driver = order.get('userDriverName') or order.get('driverName') or '未知司机' # plate = (order.get('plateNo') or '无车牌').replace('*', '') # # 联系方式 # caller = order.get('agentPassengerMobile') or order.get('passengerMobile') or '未知' # passenger = order.get('passengerMobile') or '未知' # # 时间处理 # create_time = order.get('passCreateDateStr', '').split(' ') # date_part = create_time[0] if create_time else '未知日期' # time_part = create_time[1] if len(create_time) > 1 else '未知时间' # # 车型 # car_type = order.get('orderCategoryTypeName') or '未知车型' # standard_type = order.get('standardUseCarTypeName') or '' # if standard_type: # car_type = f"{car_type}-{standard_type}" # # 地址 # start = (order.get('startAddress') or '未知起点').replace('*******', '') # end = (order.get('endAddress') or '未知终点').replace('*******', '') # # 价格信息 - 确保数值不为None # price = order.get('tripPrice') or 0.0 # # estimate_price = order.get('estimatePrice') or 0.0 # # mileage = order.get('estimateMileage') or order.get('factMileage') or 0.0 # # duration = order.get('estimateDuration') or order.get('factDuration') or 0.0 # # 订单状态 # status = order.get('orderStateName') or '未知状态' # # 渠道 # channel = order.get('standardSourceName') or '未知渠道' # if channel== "高德渠道": # # 获取orderId # order_id = order.get('orderId') or order.get('etravelOrderId') # # 获取driverId # driver_id = order.get('driverId') # # 如果两个值都存在,添加到结果列表 # if order_id and driver_id: # passenger = get_passenger_mobile(cookie_name, driver_id, order_id) # 手机号:{passenger} # 用车时间:{date_part} # {time_part} # 用车车型:{car_type} # 起点:{start} # 终点:{end} # 特惠一口价:{price:.2f}元 # 订单状态:{status} # 渠道:{channel}""" try: # 读取cookie文件 with open(cookie_path, 'r', encoding='utf-8') as f: cookies = json.load(f) # 准备请求 url = "https://admin.yueyuechuxing.cn/bos/admin/v2/order/queryDetail" now = int(datetime.now().timestamp() * 1000) day_ago = now - 1 * 120000000 # 3天前,扩大时间范围 headers = { "Content-Type": "application/json", "Content-Encoding": "gzip", "Referer": "https://admin.yueyuechuxing.cn/order/newOrder/newList", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36", "_admin_tk": get_cookie_value(cookies, 'stk') or '', "_admin_ts": str(int(datetime.now().timestamp())), "_admin_eid": get_cookie_value(cookies, '_assets_tenant_id') or '', "_admin_resource_key": "newOrderList", "_admin_current_page": "/order/newOrder/newList", "_admin_session_eid": get_cookie_value(cookies, '_assets_tenant_id') or '' } data = { "driverName": driver_name , "pageNum": 1, "pageSize": 1, "passCreateEndDate": now, "passCreateStartDate": day_ago, "showEtravelCancelOrderFlag": 0, "specialOrderFlag": 0 } # 发送请求 response = requests.post( url, cookies={c['name']: c['value'] for c in cookies}, headers=headers, json=data, timeout=15 ) if response.status_code != 200: return [f"请求失败,状态码: {response.status_code}"] result = response.json() if result['code'] != 1: return [result.get('msg', '请求失败')] if not result.get('data', {}).get('items'): return [f"未查到[{driver_name}]进行中的订单"] # 获取第一个订单的ID items = result.get('data', {}).get('items', []) if not items: return [f"未查到[{driver_name}]进行中的订单"] order_id = items[0].get('orderId') or items[0].get('etravelOrderId') if order_id: order_detail = get_order_manage_detail(cookie_path, order_id) if isinstance(order_detail, dict) and 'error' not in order_detail and items[0].get("orderStateName")!="付款完成": return [parse_order_detail(order_detail)] else: return [f"获取订单详情失败: {order_detail}"] return [f"未查到[{driver_name}]进行中的订单"] except Exception as e: return [f"发生错误: {str(e)}"] # 使用示例 if __name__ == "__main__": # 查询特定司机 import time # 记录开始时间 start_time = time.time() orders = get_cancelled_orders(driver_name="吴勇") # 这里是你的代码 time.sleep(1) # 模拟耗时操作 # 计算并打印耗时 elapsed_time = time.time() - start_time print(f"代码运行耗时: {elapsed_time:.4f} 秒") if not orders: print("未找到取消订单") else: for i, order in enumerate(orders, 1): # print(f"\n取消订单 {i}:") print(order) print("-" * 60) json解析出错
最新发布
08-02
不是微信小程序 是运行在pychram的小程序 import tkinter as tk from tkinter import ttk, messagebox import pyttsx3 import re import sys class WordReaderApp: def __init__(self, root): self.root = root self.root.title("英文单词朗读器 - 修复版") self.root.geometry("500x400") self.root.resizable(True, True) # 初始化语音引擎 self.engine = None self.init_engine() # 创建UI self.create_widgets() def init_engine(self): """尝试多种方式初始化语音引擎""" try: # 尝试默认初始化 self.engine = pyttsx3.init() self.engine.setProperty('rate', 150) return except Exception as e: print(f"默认引擎初始化失败: {e}") # 尝试特定引擎 engines = ['sapi5', 'espeak', 'nsss'] for engine_name in engines: try: self.engine = pyttsx3.init(driverName=engine_name) self.engine.setProperty('rate', 150) print(f"成功使用引擎: {engine_name}") return except: continue # 所有尝试都失败 messagebox.showerror("严重错误", "无法初始化任何语音引擎。请检查系统语音设置。") self.engine = None def create_widgets(self): # 主框架 main_frame = ttk.Frame(self.root, padding=20) main_frame.pack(fill=tk.BOTH, expand=True) # 输入提示 ttk.Label(main_frame, text="请输入英文单词:", font=("Arial", 12)).pack(pady=10) # 输入框 self.word_entry = ttk.Entry(main_frame, width=30, font=("Arial", 14)) self.word_entry.pack(pady=10, ipady=5) self.word_entry.focus() # 语音设置框架 settings_frame = ttk.LabelFrame(main_frame, text="语音设置") settings_frame.pack(fill=tk.X, pady=10) # 音量控制 ttk.Label(settings_frame, text="音量:").grid(row=0, column=0, padx=5, sticky=tk.W) self.volume_scale = ttk.Scale(settings_frame, from_=0.0, to=1.0, length=200, command=self.set_volume) self.volume_scale.set(0.8) self.volume_scale.grid(row=0, column=1, padx=5) # 语速控制 ttk.Label(settings_frame, text="语速 (0-10):").grid(row=1, column=0, padx=5, sticky=tk.W) self.rate_scale = ttk.Scale(settings_frame, from_=0, to=10, length=200, command=self.set_rate) self.rate_scale.set(5) self.rate_scale.grid(row=1, column=1, padx=5) # 按钮框架 btn_frame = ttk.Frame(main_frame) btn_frame.pack(pady=20) # 朗读按钮 self.speak_btn = ttk.Button( btn_frame, text="朗读单词", command=self.speak_word, width=15 ) self.speak_btn.pack(side=tk.LEFT, padx=10) # 测试按钮 ttk.Button( btn_frame, text="测试发音", command=self.test_speech, width=15 ).pack(side=tk.LEFT, padx=10) # 状态标签 self.status_label = ttk.Label(main_frame, text="就绪", font=("Arial", 10)) self.status_label.pack(pady=10) # 禁用按钮如果引擎不可用 if not self.engine: self.speak_btn.config(state=tk.DISABLED) self.status_label.config(text="语音引擎不可用", foreground="red") def set_volume(self, value): """设置音量""" if self.engine: self.engine.setProperty('volume', float(value)) def set_rate(self, value): """设置语速""" if self.engine: # 将0-10的范围转换为实际语速值(80-250) rate = 80 + (float(value) * 17) self.engine.setProperty('rate', rate) def speak_word(self): """朗读输入框中的单词""" if not self.engine: messagebox.showerror("错误", "语音引擎未初始化") return word = self.word_entry.get().strip() if not word: messagebox.showwarning("输入为空", "请输入要朗读的单词") return # 验证输入 if not re.match(r'^[a-zA-Z\s\-]+$', word): messagebox.showwarning("无效输入", "请输入有效的英文单词") return try: self.status_label.config(text=f"正在朗读: {word}", foreground="blue") self.root.update() # 清除之前的命令 self.engine.stop() # 朗读新单词 self.engine.say(word) self.engine.runAndWait() self.status_label.config(text="朗读完毕", foreground="green") except Exception as e: messagebox.showerror("错误", f"朗读失败: {str(e)}") self.status_label.config(text="错误", foreground="red") def test_speech(self): """测试系统语音功能""" if not self.engine: messagebox.showerror("错误", "语音引擎未初始化") return try: self.status_label.config(text="正在测试系统语音...", foreground="blue") self.root.update() self.engine.say("This is a test of the text-to-speech system.") self.engine.runAndWait() self.status_label.config(text="语音测试成功", foreground="green") except Exception as e: messagebox.showerror("错误", f"语音测试失败: {str(e)}") self.status_label.config(text="语音测试失败", foreground="red") if __name__ == "__main__": root = tk.Tk() app = WordReaderApp(root) root.mainloop() 输入错误单词时有系统提醒声音 就是显示正在读单词时没有声音
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值