首先这是我的设置:
我正在 Jupyter 笔记本中工作,并尝试使用 SQLAlchemy 从 MS SQL Server 数据库导入一列数据。相关列包含存储长文本字符串的单元格(数据类型为 nvarchar(max))。这是我的代码:
engine = create_engine('mssql+pyodbc://user:password@server:port/db_name?driver=SQL+Server+Native+Client+11.0'
stmt = 'SELECT componenttext FROM TranscriptComponent WHERE transcriptId=1265293'
connection = engine.connect()
results = connection.execute(stmt).fetchall()
这执行得很好,并导入了一个字符串列表。然而,当我检查字符串时,它们被截断,并且在字符串中间似乎插入了以下消息:
... (8326 characters truncated) ...
每个字符串的字符数各不相同。我检查了导入的字符串有多长,被截断的字符串都限制在 339 或 340 个字符。
这是 SQLAlchemy、Python 或其他完全的限制吗?
任何帮助表示赞赏!
同样的问题!
设置:
Windows Server 2012 MS SQL Server 2016/PostgreSQL 10.1 Python 3.6 Anaconda 发行版 我已经测试了我能做的一切,但无法超越字段长度的 33 倍限制。 varchar/text 似乎受到影响,而 DBMS/驱动程序似乎没有任何影响。
编辑:
找到“问题”的根源:https://bitbucket.org/zzzeek/sqlalchemy/issues/2837
似乎 fetchall() 受到此功能的影响。
我发现的唯一解决方法是:
empty_list=[]
connection = engine.connect()
results = connection.execute(stmt)
for row in results:
empty_list.append(row['componenttext'])
这样我在长字符串字段(>3000 ch)中没有发现任何截断。
当我使用 sqlalchemy 执行时,这对我来说是不可挽回的:
SELECT OBJECT_DEFINITION(OBJECT_ID('my_view')) AS ViewDefinition
但是以不同的方式获取视图定义却有效:
EXEC sp_helptext 'my_view'
因为这似乎是按行返回文本而不是一个字符串。