Uploaded image for project: 'CUBRID APIs'
  1. CUBRID APIs
  2. APIS-523

[Python] When the Sql generated by Django contains LIMIT keyword, the format is not right according to CUBRID specification.

    Details

      Description

      ----Original Message----
      From: "오보명(Laura Oh)"<obm@nhn.com>
      To: "李成龙[이성룡]"<lichenglong@nhn.com>;
      Cc: "백정한[Daniel]"<danielbaek@nhn.com>;
      Sent: 2013-03-29 (금) 11:41:01
      Subject: FW: Cubrid Python Driver 관련 소스 및 정보

      으악!!!!!!

      ----Original Message----
      From: "김리택"<reetaeg@nhn.com>
      To: "오보명[Laura Oh]"<obm@nhn.com>;
      Cc: "ndrivebiz_공유"<dl_ndrivebiz@nhn.com>;
      Sent: 2013-03-29 (금) 11:39:14
      Subject: RE: Cubrid Python Driver 관련 소스 및 정보

      안녕하세요 클라우드스토리지사업팀 김리택 입니다.

      기존 Cubrid DateFormat 관련해서 수정은 어떻게 되어 가고 있는지? 또 언제쯤 새 패치를 받을 수 있을 까요?

      그런데 또 추가적인 문제점이 발견되어 우선 메일로 공유 드립니다.

      Django 내에서 Paging 관련 해서 Limit 쿼리를 사용해서 Paging 처리를 하고 있는데 이부분 또한 MySQL SQL 구문과
      Cubrid 구문이 상이해서 오류가 발생 됩니다.

      MySQL LIMIT

      {limit} [OFFSET {offset}] 이며
      Cubrid LIMIT [{offset], ] {limit}

      로 되어 있습니다.

      Cubrid driver 소스를 확인 해보니 pass 처리 되어 있어서 Django Function을 그대로 사용 하도록 되어 있습니다.

      우선 django_cubrid/compiler.py 에 페이징 처리 쿼리를 처리하여 동작은 하도록 수정은 하였습니다.
      이 부분도 재검토 해서 패치 부탁 드립니다.

      수정 내용은
      ......
      def as_sql(self, with_limits=True, with_col_aliases=False):
      if with_limits:
      """ MySQL LIMIT limit [OFFSET offset]
      if self.query.high_mark is not None:
      result.append('LIMIT %d' % (self.query.high_mark - self.query.low_mark))
      if self.query.low_mark:
      if self.query.high_mark is None:
      val = self.connection.ops.no_limit_value()
      if val:
      result.append('LIMIT %d' % val)
      result.append('OFFSET %d' % self.query.low_mark)
      """

      1. Cubrid LIMIT [offset,] limit
        if self.query.high_mark is not None:
        if self.query.low_mark:
        result.append('LIMIT %d , %d' % (self.query.low_mark, (self.query.high_mark - self.query.low_mark)))
        else:
        result.append('LIMIT %d' % (self.query.high_mark - self.query.low_mark))
        ......

      감사합니다.
      ==
      你好,我是cloud storage 业务 team的김리택。

      对之前的Cubrid DateFormat相关的修改工作进行的怎么样了?另外什么时候能收到新的补丁呢?

      现在又有了新的问题,特此共享。

      在Django内部关于Paging的部分是使用Limit query来做Paging处理的,但是这个部分由于 MySQL SQL语法和
      Cubrid语法不同而发生error。

      是MySQL LIMIT

      {limit} [OFFSET {offset}]
      Cubrid LIMIT [{offset], ] {limit}

      查看Cubrid driver source发现是做了 pass处理所以直接使用了Django Function。

      先在django_cubrid/compiler.py 上做了paging处理的query来进行操作。
      这个部分也请检查一下并做个patch。

      修改内容是
      ......
      def as_sql(self, with_limits=True, with_col_aliases=False):
      if with_limits:
      """ MySQL LIMIT limit [OFFSET offset]
      if self.query.high_mark is not None:
      result.append('LIMIT %d' % (self.query.high_mark - self.query.low_mark))
      if self.query.low_mark:
      if self.query.high_mark is None:
      val = self.connection.ops.no_limit_value()
      if val:
      result.append('LIMIT %d' % val)
      result.append('OFFSET %d' % self.query.low_mark)
      """

      1. Cubrid LIMIT [offset,] limit
        if self.query.high_mark is not None:
        if self.query.low_mark:
        result.append('LIMIT %d , %d' % (self.query.low_mark, (self.query.high_mark - self.query.low_mark)))
        else:
        result.append('LIMIT %d' % (self.query.high_mark - self.query.low_mark))
        ......

      谢谢。

      ----Original Message----
      From: "김리택"<reetaeg@nhn.com>
      To: "오보명[Laura Oh]"<obm@nhn.com>;
      Cc: "클라우드스토리지사업팀"<nt00244@nhn.com>;
      Sent: 2013-03-28 (목) 11:39:05
      Subject: Cubrid Python Driver 관련 소스 및 정보

      안녕하세요 클라우드스토리지사업팀 김리택 입니다.

      요청 하신 Sample Test 소스 전달 드립니다.
      Python 2.7 + Django 1.5 환경이며
      추가적으로 site-packages 는

      • cubrid_python-9.1.0.0001-py2.7
      • django_admin_tools-0.5.1-py2.7
      • south-0.7.6.py2.7

      Cubrid DB는 Cubrid 2008 R4.1 (8.4.1.7007) 입니다.

      Cubrid DB 설정은 아래와 같이 수정 하시면 됩니다.
      /mysite/settings.py
      DATABASES = {
      'default':

      { 'ENGINE': 'django_cubrid', 'NAME': 'admindb', 'USER': 'dba', 'PASSWORD': 'XXXX', 'HOST': 'XXX.XXX.XXX.XXX', 'PORT': 'XXXXX', }

      }

      혹 필요한 정보 있으시면 답변 주시기 바랍니다 감사합니다.
      ==
      Cubrid DB是 Cubrid 2008 R4.1 (8.4.1.7007) 。

      Cubrid DB 的设置如下进行修改即可。
      /mysite/settings.py
      DATABASES = {
      'default':

      { 'ENGINE': 'django_cubrid', 'NAME': 'admindb', 'USER': 'dba', 'PASSWORD': 'XXXX', 'HOST': 'XXX.XXX.XXX.XXX', 'PORT': 'XXXXX', }

      }

      若需要其他信息请回复,谢谢。

      이 메일은 나눔글꼴로 작성되었습니다. 설치하기

        Activity

        Hide
        jinhu 李金虎 added a comment -

        Issue analysis:
        The django_cubrid backend missed to process the SQL containing 'LIMIT', and then the Django framework use default manipulation in as_sql().
        This default way dosen't accord with the CUBRID specification.

        Show
        jinhu 李金虎 added a comment - Issue analysis: The django_cubrid backend missed to process the SQL containing 'LIMIT', and then the Django framework use default manipulation in as_sql(). This default way dosen't accord with the CUBRID specification.
        Hide
        jinhu 李金虎 added a comment - - edited

        Fix in RB-9.1.0, rev: 1777
        Fix in RB-8.4.1, rev: 1778
        Fix in RB-8.4.3, rev: 1779
        Fix in RB-8.4.4, rev: 1780
        Fix in trunk, rev: 1781
        Fix in RB-9.1.0_static_cci, rev: 1782

        Resolved.

        Show
        jinhu 李金虎 added a comment - - edited Fix in RB-9.1.0, rev: 1777 Fix in RB-8.4.1, rev: 1778 Fix in RB-8.4.3, rev: 1779 Fix in RB-8.4.4, rev: 1780 Fix in trunk, rev: 1781 Fix in RB-9.1.0_static_cci, rev: 1782 Resolved.

          People

          • Assignee:
            jinhu 李金虎
            Reporter:
            jinhu 李金虎
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: