【发布时间】:2025-11-22 17:45:02
【问题描述】:
我有一个使用 Flask-SQLAlchemy 连接到数据库的 Flask 应用程序。当我想向一个太长或无效(ish)的表中插入一个值时,我通常会收到一个警告,指出该值已被截断,并且 MySQL 会愉快地插入该值的有效部分。这会导致以后出现各种问题。
在我的连接过程中检查sql_mode 变量会产生以下模式:
STRICT_TRANS_TABLESERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTION
为了实现我的目标,我需要将STRICT_ALL_TABLES 添加到这个组合中,我可以通过这个(漂亮的转储)sn-p 轻松做到这一点(db 是我应用中的SQLAlchemy 实例):
res = list(db.engine.execute('SHOW VARIABLES LIKE \'sql_mode\''))
modes = res[0][1].split(',')
db.engine.execute(f'SET sql_mode = \'{",".join(modes)}\'')
# I tried and failed using the following for some reason
db.engine.execute('SET sql_mode = ?', '.'.join(modes)
在此之后,当我使用不合适的值更新模型时,我得到了我想要的;异常而不是警告:
sqlalchemy.exc.DataError: (pymysql.err.DataError) (1265, "Data truncated for column 'value' at row 1")
问题是,当我每次连接到 MySQL 实例时,如何告诉 SQLAlchemy 执行此操作?
【问题讨论】:
-
根据docs,省略修饰符意味着
SESSION。 -
错误消息是指
value列,而您的 SQL 文本不包含此类子字符串。您确定错误消息是由显示的 SQL 语句执行产生的吗?
标签: python mysql sqlalchemy flask-sqlalchemy