SQLAlchemy Query不返回所有大文本字段

时间:2011-11-17 00:15:36

标签: python sql django sqlalchemy

首先,这里有一点关于我的环境:

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

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

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

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

有什么想法吗?我似乎在我的智慧结束。

编辑:以下是一些要求的信息:

OS: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是他遇到问题的两个字段。

这是一个测试查询和echo:

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'}

1 个答案:

答案 0 :(得分:4)

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

  1. 关于SO的相关问题:Data ended at 64512 characters - MSSQL // PHP // OPENSuSE // APACHE2
  2. here提取的另一个Q& A:
  3.   

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

         

    文本数据类型与char和varchar类型不同。该   文本列的最大数据长度由文本大小控制   连接选项。微软声称在他们的文档中使用了   默认文本大小为4000个字符,但实际上是它们的实现   是不一致的。有时返回大小为4的文本列   GB!

         

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

    1> set textsize 10000 
    2> go 
    
      

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


    只是旁注:您似乎使用了相当过时的pymssql版本。