2011-11-17 2 views
4

첫번째로 모두를 반환하지 :SQLAlchemy의 쿼리가 여기 내 환경에 대한 조금의 큰 텍스트 필드

  • 내 데이터베이스 관리 도구로 MSSMS 사용.

SQLAlchemy의을 사용하여 장고 1.3

  • 사용
  • 나는 아무 최대 길이 데이터베이스에 텍스트 필드가 있습니다. 텍스트에는 길이가 890591자인 텍스트가 있습니다.

    SQLAlchemy을 사용하여이 필드를 검색하면 64512 자로 잘립니다. 나는 여러 다른 큰 행에도 시도해 봤는데 항상 64512로 잘렸다.

    SELECT @@TEXTSIZE은 160 만 개라는 다소 불합리한 값을 반환하므로 문제가되지 않는다. 내가 SELECT DATALENGTH(field)을하면 올바른 890591을 반환합니다. 따라서 데이터베이스가 아닌 것 같습니다. SQLAlchemy 인 것 같습니다. 아니면 파이썬의 한계 일 수도 있습니다.

    아이디어가 있으십니까? 내 재치가있는 것 같아.

    편집 : 여기에 요청 된 좀 더 많은 정보가있다 :

    OS : 데비안 5.0.9

    SQLAlchemy의 : 0.7.3

    SQL : MS SQL 서버 2008

    DB 연결 : mssql + pymssql : // 이름 : 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 그가 가진 문제가있는 두 개의 필드가 있습니다. 여기

    은 테스트 쿼리 및 에코 :

    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

    내가 SQL Server에 * 괜찬아 연결의 조금 알고 있지만, 간단하게 인터넷 검색은 문제가 FreeTDS 구성과 관련이 있음을 시사 :

    1. 관련 질문 SO : Data ended at 64512 characters - MSSQL // PHP // OPENSuSE // APACHE2.
    2. 또 다른 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

    관련 문제