首页 > 解决方案 > 为什么在刷新数据库更改后 SQLAlchemy 将字符串更改为整数?

问题描述

我已经定义了一个 SQLAlchemy Table 对象,使其具有 type 的列属性Text。然后我创建表对象的一个​​实例并将列属性设置为一串数字。该属性肯定以字符串开头,但是在flush使用数据库会话调用之后,该属性将更改为整数。当属性应该是文本字符串时,为什么 SQLAlchemy 会将此属性更改为整数?

这适用于 Python 3.6.7、SQLAlchemy 1.3.6 和 MySQL 8.0.15。

这是表定义:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, Text

Base = declarative_base()

class Entry(Base):
    __tablename__ = 'Entry'
    id = Column(Integer, primary_key=True)
    value = Column(Text, nullable=True)

以下是表类的使用方式:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

database_uri = "SOME_MYSQL_URI"

db_engine = create_engine(database_uri, pool_recycle=3600)

session = scoped_session(
    sessionmaker(
        autocommit=True,
        autoflush=False,
        bind=db_engine
    )
)

entry = Entry(value='0123') 
session.add(entry)
session.flush()

您可以entry.value在终端中调用 flush 方法后看到更改:

>>> entry.value 
'0123'

>>> type(entry.value)
<class 'str'>

>>> session.flush()

>>> entry.value
123

>>> type(entry.value)
<class 'int'>

需要注意的是,数据库在表中将该值保存为“0123”。似乎是 python 解释器将值重新转换为整数。此外,具有非数字字符的字符串似乎不受影响。

标签: pythonmysqlsqlalchemy

解决方案


推荐阅读