【问题标题】:SQLAlchemy Query not returning all of large text fieldSQLAlchemy 查询不返回所有大文本字段
【发布时间】:2011-12-30 22:14:44
【问题描述】:

首先,介绍一下我的环境:

  • 使用 MSSMS 作为我的数据库管理工具。
  • 使用 Django 1.3
  • 使用 SQLAlchemy

我在数据库中有一个没有最大长度的文本字段。其中有 890591 个字符长的文本。

当我使用 SQLAlchemy 检索此字段时,它被截断为 64512 个字符。我也尝试过其他几个大行,它总是被截断为 64512。

SELECT @@TEXTSIZE 返回一些荒谬的值,例如 160 万,所以这不是问题。如果我做SELECT DATALENGTH(field) 它返回正确的890591。所以它似乎不是数据库,它似乎是SQLAlchemy。或者可能是一些 Python 限制。

有什么想法吗?我似乎不知所措了。

编辑:这是要求的更多信息:

操作系统:Debian 5.0.9

SQLAlchemy:0.7.3

SQL:MS Sql Server 2008

数据库连接:mssql+pymssql://name:password@server/dbname

pymssql 版本:1.0.2

有问题的型号:

class RACReport(Base):
    __tablename__ = 'RACReport'
    id                      = Column(properUUID(), primary_key=True, nullable=False, default=genuuid4, server_default=text('NEWID()'))
    client_id               = Column(properUUID(), ForeignKey(Client.id), nullable=False)
    rawdata                 = Column(Text(), nullable=True)
    rawtime                 = Column(DateTime(), nullable=True, default=datetime.datetime.now())
    processeddata           = Column(Text(), nullable=True)
    processedtime           = Column(DateTime(), nullable=True)
    reportstartdate         = Column(DateTime(), nullable=False)
    reportenddata           = Column(DateTime(), nullable=False)
    numberofdocs            = Column(Integer(), nullable=True)
RACReport.__table__.schema='rac'

class properUUID(st.TypeDecorator):
    impl = mssql.MSUniqueIdentifier
    def process_result_value(self, value, dialect):
        if value:
            return str(uuid.UUID(bytes_le=value))

def genuuid4():
    return str(uuid.uuid4())

rawdata 和 processdata 是他遇到问题的两个字段。

这是一个测试查询和回显:

rac.session.query(rac.RACReport).filter(rac.RACReport.id=='8fb76cb7-d752-45af-a20a-3b85d5e7b8a6').all()

2011-11-17 09:39:46,890 INFO sqlalchemy.engine.base.Engine SELECT [RACReport_1].id AS [rac_RACReport_id], [RACReport_1].client_id AS [rac_RACReport_client_id], [RACReport_1].rawdata AS [rac_RACReport_rawdata], [RACReport_1].rawtime AS [rac_RACReport_rawtime], [RACReport_1].processeddata AS [rac_RACReport_processeddata], [RACReport_1].processedtime AS [rac_RACReport_processedtime], [RACReport_1].reportstartdate AS [rac_RACReport_reportstartdate], [RACReport_1].reportenddate AS [rac_RACReport_reportenddate] FROM rac.[RACReport] AS [RACReport_1] WHERE [RACReport_1].id = %(id_1)s 2011-11-17 09:39:46,890 INFO sqlalchemy.engine.base.Engine {'id_1': '8fb76cb7-d752-45af-a20a-3b85d5e7b8a6'}

【问题讨论】:

  • 这个值与 2^16 - 2^10 相同,有点意思。
  • @BrianCain 我也这么认为...
  • 您能否使用pdbpudb 单步进入相关的SQLAlchemy 代码?
  • @BrianCain 嗯......当我在 pdb 中运行它时,它对我来说很糟糕,因为它找不到变量,所以我认为 pdb 可能会将它超出范围或其他原因。不过我是 iPython 的新手,所以明天我会让我的同事用 pdb 来看看它。他今天也想不出解决问题的办法,所以他离开办公室后我就一直在研究。
  • 重新回显查询:您是否仍然通过手动执行此查询看到错误数据?您可以从 MSSQL 控制台尝试session.execute()pymssql.cursor().execute()。这可能有助于隔离数据损坏的位置。

标签: python sql django sqlalchemy


【解决方案1】:

我对 *nix 与 SQL Server 的连接知之甚少,但简单的谷歌搜索表明该问题与 FreeTDS 配置有关:

  1. 关于 SO 的相关问题:Data ended at 64512 characters - MSSQL // PHP // OPENSuSE // APACHE2
  2. 另一个问答摘自here

我的文本数据被截断或导致我的客户端中断。

文本数据类型不同于 char 和 varchar 类型。这 文本列的最大数据长度由文本大小控制 连接选项。 Microsoft 在其文档中声称使用 默认文本大小为 4000 个字符,但实际上它们的实现 不一致。有时会返回大小为 4 的文本列 国标!

最好的解决方案是确保将 textsize 选项设置为 建立连接时的合理值。例如:

1> set textsize 10000 
2> go 

另请参阅 freetds.conf 中的文本大小选项。


附带说明:您似乎使用的是相当过时的pymssql 版本。

【讨论】:

  • 无论出于何种原因,freetds.conf 默认将文本大小设置为 64512。从配置文件中删除文本大小限制,并且库(根据文档)应该默认为一些非常大的大小。
  • 更改 freetds.conf 有效,谢谢大家!我不知道 freeTDS 是 pymssql 的后端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多