首先,这里有一点关于我的环境:
我在数据库中有一个没有最大长度的文本字段。其中有文字长度为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'}
答案 0 :(得分:4)
我对SQL Server的* nix连接知之甚少,但简单的谷歌搜索表明该问题与FreeTDS配置有关:
我的文字数据被截断或导致我的客户端中断。
文本数据类型与char和varchar类型不同。该 文本列的最大数据长度由文本大小控制 连接选项。微软声称在他们的文档中使用了 默认文本大小为4000个字符,但实际上是它们的实现 是不一致的。有时返回大小为4的文本列 GB!
最佳解决方案是确保将textsize选项设置为a 建立连接时的合理价值。例如:
1> set textsize 10000
2> go
另请参阅freetds.conf中的文本大小选项。
只是旁注:您似乎使用了相当过时的pymssql
版本。