2011-11-17 56 views
4

一起來的,這裏是我的環境一點點: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中

DB連接: MSSQL + pymssql://用戶名:密碼@服務器/ 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和過程數據是他是有這個問題的兩個領域。

這是一個測試查詢和回聲:

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

+0

有趣的是,價值是相同的2^16 - 2^10。 –

+0

@BrianCain我也這麼認爲... – MatthewKremer

+0

你可以用'pdb'或'pudb'單步進入相關的'SQLAlchemy'代碼嗎? –

回答

4

我知道小* nix中連接到SQL Server的,但簡單的谷歌搜索顯示,該問題與FreeTDS配置:

  1. 關於SO的相關問題:Data ended at 64512 characters - MSSQL // PHP // OPENSuSE // APACHE2
  2. 其他Nexus Q &一個從here提取:

我的文字數據被截斷或正在引起我的客戶突破。

文本數據類型與char和varchar類型不同。文本列的最大數據長度由連接選項的文本大小 控制。Microsoft在其文檔中聲稱使用默認文本大小爲4000個字符的 ,但實際上它們的實現 不一致。有時文本列的大小會返回4 GB!

最好的解決方案是確保在建立連接時將textsize選項設置爲 合理的值。例如:

1> set textsize 10000 
2> go 

又見freetds.conf文字大小選項。


而只是一個側面說明:你似乎可以用的pymssql而過時的版本。

+1

無論出於何種原因,freetds.conf默認將文本大小設置爲64512。從配置文件中刪除文本大小限制,並且庫(根據文檔)應該默認爲一些非常大的大小。 – tuomur

+0

更改freetds.conf的工作,謝謝你們!我不知道freeTDS是pymssql的後端。 – MatthewKremer