百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Python开发 常见异常和解决办法 python程序出现异常会执行哪个语句

liuian 2024-12-27 15:16 54 浏览

1.sqlalchemy创建外键关系报错property of that name exists on mapper

SQLAlchemy是Python编程语言下的一款开源软件,提供了SQL工具包及对象关系映射(ORM)工具,使得在Python中操作MySQL更加简单。在给两个表创建外键关系时可能会报错:

sqlalchemy.exc.ArgumentError: Error creating backref 'xxx' on relationship 'xxx.xxx': property of that name exists on mapper 'mapped class xxx->xxx'
1

两个数据模型如下:

class Website(Base):
    __tablename__ = 'website'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(10), nullable=False)
    link = Column(String(40), nullable=False)

    orders = relationship('Order', backref='website')

class Order(Base):
    __tablename__ = 'order'
    id = Column(String(50), primary_key=True)
    desc = Column(Text, nullable=False)
    link = Column(String(80), nullable=False)
    contact = Column(String(30))
    category = Column(String(15))
    is_valid = Column(Boolean, nullable=False)
    add_time = Column(DateTime, default=datetime.now)
    website = Column(Integer, ForeignKey('website.id'), nullable=False)
    is_deleted = Column(Boolean, default=False)
12345678910111213141516171819

其中一个order对于各website,一个website可以对应多个order,在Website模型中定义关系时,backref为website,这与Order中本来的字段website重复而冲突,可以将该字段改名如wid,也可以将backref换名即可。

2.openpyxl保存数据报错openpyxl.utils.exceptions.IllegalCharacterError

在使用openpyxl保存数据时报错如下:

raise IllegalCharacterError
openpyxl.utils.exceptions.IllegalCharacterError
12

这是因为要保存的数据中存在一些openpyxl认为是非法字符的字符串,需要进行替换,直接使用其提供的ILLEGAL_CHARACTERS_RE进行转换即可,如下:

from openpyxl import Workbook
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE

content = ILLEGAL_CHARACTERS_RE.sub(r'', content)
ws.cell(ridx, cidx).value = content
12345

此时即可正常保存数据。

3.使用sqlalchemy保存字符串到MySQL中时报错Incorrect string value: ‘\xF0…’ for column ‘desc’ at row 1

在使用sqlalchemy保存字符串数据到MySQL中会报错:

raise errors.get_exception(packet)
mysql.connector.errors.DatabaseError: 1366 (HY000): Incorrect string value: '\xF0\x9F\x91\x89\xCF\x84...' for column 'desc' at row 1
12

这是因为特殊字符\xF0\x9F\x91\x89\xCF\x84...导致的,实际上这是表情字符,即Emoji对应的字符,但是因为MySQL一般的字符集是utf8,因此Emoji表情或者某些特殊字符是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

解决方法有两种:

  • 修改数据库的默认字符集编码
    修改为MySQL支持Emoji的字符集utf8mb4,具体如下:
    (1)在MySQL的安装目录中找到配置文件my.ini,修改如下:[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' 123456789(2)并通过命令修改当前数据库和表的编码:ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; alter table table_name convert to character set utf8mb4 collate utf8mb4_bin; 123(3)配置完成后重新启动MYSQL服务即可
  • 替换Emoji字符串
    通过正则表达式匹配字符串中的Emoji字符并替换,即可不用修改数据库的字符集也能正常插入。具体如下:import re # Emoji字符正则表达式 try: # Wide UCS-4 build emoji_regex = re.compile(u'[' u'\U0001F300-\U0001F64F' u'\U0001F680-\U0001F6FF' u'\u2600-\u2B55]+', re.UNICODE) except re.error: # Narrow UCS-2 build emoji_regex = re.compile(u'(' u'\ud83c[\udf00-\udfff]|' u'\ud83d[\udc00-\ude4f\ude80-\udeff]|' u'[\u2600-\u2B55])+', re.UNICODE) desc = emoji_regex.sub('[Emoji]', desc_str) # desc为可能包含表情的字符串 1234567891011121314151617181920

这两种方法中,个人建议使用第二种方法,只是对字符串进行处理,无需修改数据库的相关配置。

4.使用sqlalchemy将字符串保存到MySQL报错AttributeError: ‘MySQLConverter’ object has no attribute ‘__elementunicoderesult_to_mysql’

在使用requests库爬取到网页并使用lxml.etree包进行解析网页后,通过xpath获取到指定的元素和文本,并通过sqlalchemy将文本保存到数据库中时报错:

raise errors.ProgrammingError(
sqlalchemy.exc.ProgrammingError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
(mysql.connector.errors.ProgrammingError) Failed processing pyformat-parameters; Python '_elementunicoderesult' cannot be converted to a MySQL type
123

这是因为通过lxml.etree获取到的字符串可能是_elementunicoderesult,这是Python中字符串的一种,danssqlalchemy并未蹄冻将该类型变量转化为SQL对象的方法,因此需要强制转换为str类型,再进行数据保存,如下:

link = str(order.xpath('./div[1]/div[2]/a/@href')[0])
#...
order = OrderModel(id=yid, desc=desc, link=link, contact=contact, category='', pub_time=None, is_valid=is_valid, is_delete=False if is_valid else True)
order.website = website
session.add(order)
session.commit()

本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

相关推荐

数据标注接单平台(数据标注接单平台哪个挣得多一点)

数据标注员在家可以通过以下方式接单:1.在线平台:有许多数据标注平台允许数据标注员在家完成标注任务,例如标注客、标注助手、数据堂等。这些平台提供了在线标注工具和API接口,让数据标注员可以在家里使用...

电脑垃圾怎么清理系统垃圾(电脑垃圾怎么清理干净)

电脑清理c盘空间只留系统的操作方法如下。1、打开电脑,找到我的电脑,双击我的电脑,找到盘符C的系统盘。2、找到“属性”菜单。3、点击“属性”后,系统会出现一个新的界面,在新的界面,我们找到“磁盘清理”...

显卡推荐性价比2025(显卡2020性价比)

2021年买1000块钱的这种显卡性价比最好的还是小米的显卡比较好,因为小米的电子产品呢是比较好的一款它的质量是比较好的,也是比较靠谱的,尤其是1000块钱以内买的这种显卡呢他的内存是比较大的,所以价...

thinkpad原厂系统重装方法(thinkpad如何重新装系统)

若需重装原装系统,需备份系统数据,制作启动盘或将原装系统镜像刻录至光盘或USB。进入BIOS设置,启动优先选项设定为启动盘,重启电脑。按提示选择新系统安装位置。安装完成后更新系统和驱动程序。最后恢复数...

安装系统教程win10(安装系统教程win7)

正确安装win10系统的步骤如下:1.确认电脑是否满足win10系统的最低配置要求,如CPU、内存、硬盘空间等。2.下载win10系统镜像文件,可以通过微软官网或第三方下载网站获取。3.制作U盘...

pps影音手机版下载官网(pps影音百科)

区别:1,爱奇艺主打网页播放,PPS主打客户端播放器;2,爱奇艺视频正版高清,PPS不全是高清,有部分盗版;3,爱奇艺在线播放比较好,PPS的P2P加载技术打开视频较快。1、爱奇艺PPS影音其实是爱...

百度官方下载安装免费(百度官网免费下载)

你好!有两种方法可以免费下载!第一:加入百度文库VIP看百度文库的说明,只要加入百度文库的VIP即可免费下载,不过不推荐这种还是需要花钱的方式第二:下载冰点下载器那这种方法该如何免费下载呢?下面我详细...

windows10更新文件在哪里(win10系统更新文件在哪个文件夹)
windows10更新文件在哪里(win10系统更新文件在哪个文件夹)

win10自动更新下载的文件位于C:\Windows\SoftwareDistribution\Download文件夹中。当然我们要找到哪个文件夹确切到哪个补丁并不是那么容易的,因为命名的文件夹都是长长的一段代号,一般我们要删除更新文件的...

2026-01-02 03:55 liuian

扫描仪怎么安装(信鸽扫描仪怎么安装)

扫描仪的安装步骤可能会略有不同,具体取决于您所使用的扫描仪品牌和型号。一般而言,您可以按照以下基本步骤来安装扫描仪:确认您的计算机系统符合扫描仪的最低系统要求。在计算机上插入扫描仪的安装光盘,或从制造...

u盘怎么启动重装系统(u盘启动重装系统哪个好)

1.下载好系统之家U盘以后在电脑上插入U盘并打开软件,软件会自,动配置用户的电脑信息,点击制作U盘启动盘。2.接着就进入了选择系统的界面,在这里选择需要安装的系统版本,然后点击开始制作。3.弹出提示窗...

photoshopcs6哪一年的(pscs6版本好用吗)

pscs6的发行时间是2012年4月24日,该软件是是AdobePhotoshop的第13代,具有多种功能,包括内容识别修补、Mercury图形引擎/3D性能提升/3D控制功能/改良的设计工具/全新的...

电脑如何设置自动关机win10(win10系统电脑怎么设置自动关机)

windows10自动关机设置方法如下1、打开电脑管家主界面,点击右下角的“工具箱”;2、在工具箱的其他分类中选择打开“健康小助手”;3、健康小助手中有三项功能,护眼配色、定时休息和定时关机,点击定时...

wan口未连接是欠费吗(wan口未连接是怎么回事)

网费欠费了路由器WAN指示灯常亮不闪烁,一个灯亮。路由器正常工作的话,电源指示灯是常亮状态,SYS系统指示灯和WAN指示灯会闪亮,尤其是WAN指示灯的状态有些复杂:如果WAN指示灯不亮,说明网络连接有...

如何用手机修复sd卡(如何用手机修复sd卡受损)

第一步:将要修复的内存卡,用读卡器连接到电脑上,然后下载失易得数据恢复软件。    第二步:运行软件,选择要恢复的“u盘/储存卡”功能。注:在恢复数据之...

惠普台式机bios设置(惠普台式机bios设置核显内存)

1、按电源键启动电脑,在屏幕刚亮时,不停点击F10按键,就可以进入BIOS界面;2、如果F10没反应,则在启动时不停点击ESC键;3、这个时候会进入到启动菜单选项,F10BIOSSetup就是BI...