Mat*_*mer 5 python sql django 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())
Run Code Online (Sandbox Code Playgroud)
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'}
我对 *nix 与 SQL Server 的连接知之甚少,但简单的谷歌搜索表明该问题与FreeTDS配置有关:
我的文本数据被截断或导致我的客户端崩溃。
文本数据类型不同于 char 和 varchar 类型。文本列的最大数据长度由 textsize 连接选项控制。微软在其文档中声称使用 4000 个字符的默认文本大小,但实际上他们的实现不一致。有时返回的文本列大小为 4 GB!
最好的解决方案是确保在建立连接时将 textsize 选项设置为合理的值。例如:
1> set textsize 10000
2> go
Run Code Online (Sandbox Code Playgroud)
另请参阅 freetds.conf 中的文本大小选项。
只是一个旁注:您似乎正在使用相当过时的版本pymssql。
| 归档时间: |
|
| 查看次数: |
2080 次 |
| 最近记录: |