<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On 25 Mar 2017, at 10:58, Brice PARENT <<a href="mailto:contact@brice.xyz" class="">contact@brice.xyz</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
  
    <meta content="text/html; charset=windows-1252" http-equiv="Content-Type" class="">
  
  <div bgcolor="#FFFFFF" text="#000000" class=""><p class="">Hello!</p><div class=""><br class=""></div></div></div></blockquote>Hello!</div><div><br class=""><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class=""><p class="">If I had to provide a unified way of dealing with data, whatever
      its source is, I would probably go with creating an standardized
      ORM, probably based on Django's or PonyORM, because:</p><p class="">- it doesn't require any change in the Python language</p><div class=""><br class=""></div></div></div></blockquote><div><br class=""></div>So we basically want to be just like PonyORM (the part that executes comprehensions against objects and databases), </div><div>except we find that the current comprehension syntax is not powerful enough to express all the queries we want. So </div><div>we extended the comprehension syntax, and then our strategy is a lot like PonyORM.</div><div><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class=""><p class="">- it allows queries for both reading and writing. I didn't see a
      way to write (UPDATE, CREATE and DELETE equivalents), but maybe I
      didn't look right. Or maybe I didn't understand the purpose at
      all!</p><div class=""><br class=""></div></div></div></blockquote><div><br class=""></div>Good point! This is a hard one, a single query in PythonQL can go against multiple databases, so doing updates with queries can be a big problem.</div><div>We can add an insert/update/delete syntax to PythonQL and just track that these operations make sense.</div><div><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class=""><p class="">- it makes it easy (although not fast) to extend to any backend
      (files, databases, or any other kind of data storage)</p><div class=""><br class=""></div></div></div></blockquote><div><br class=""></div>Going to different backends is not a huge problem, just a bit of work.<br class=""><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class=""><p class="">- as a pure python object, any IDE already supports it.</p><p class="">- It can live as a separate module until it is stable enough to
      be integrated into standard library (if it should ever be
      integrated there).</p><div class=""><br class=""></div></div></div></blockquote><br class="">So we live as an external module via an encoding hack :)</div><div><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class=""><p class="">- it is way easier to learn and use. Comprehensions are not the
      easier things to work with. Most of the places I worked in forbid
      their use except for really easy and short cases (single line,
      single loop, simple tests). You're adding a whole new syntax with
      new keywords to one of the most complicated and less readable (yet
      efficient in many cases, don't get me wrong) part of the language.<br class=""></p></div></div></blockquote><div><br class=""></div><div>Yes, that’s true. But comprehensions are basically a small subset of SQL, we’re extending it a bit to get the full power</div><div>of query language. So we’re catering to folks that already know this language or are willing to learn it for their</div><div>daily needs.</div><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class=""><p class="">
    </p><p class="">I'm not saying there is no need for what you're developing, there
      probably is if you did it, but maybe the solution you chose isn't
      the easier way to have it merged to the core language, and if it
      was, it would really be a long shot, as there are many new
      keywords and new syntax to discuss, implement and test. <br class=""></p></div></div></blockquote><div><br class=""></div>Yes, we started off by catering to folks like data scientists or similar folks that have to write really complex queries all the time.<br class=""><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class=""><p class="">
    </p><p class="">But I like the idea of a standard API to deal with data, a nice
      battery to be included.</p><p class="">Side note : I might not have understood what you were doing, so
      if I'm off-topic, tell me !</p><p class="">-Brice<br class=""></p></div></div></blockquote><div><br class=""></div><div>Thanks for the feedback! This is very useful.</div><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class=""><p class="">
    </p>
    <br class="">
    <div class="moz-cite-prefix">Le 24/03/17 à 16:10, Pavel Velikhov a
      écrit :<br class="">
    </div>
    <blockquote cite="mid:629E7A2A-7668-4A9B-A812-F846A2785E3D@gmail.com" type="cite" class="">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252" class="">
      Hi folks!
      <div class=""><br class="">
        <div class="">  We started a project to extend Python with a
          full-blown query language about a year ago. The project is
          call PythonQL, the links are given below in the references
          section. We have implemented what is kind of an alpha version
          now, and gained some experience and insights about why and
          where this is really useful. So I’d like to share those with
          you and gather some opinions whether you think we should try
          to include these extensions in the Python core.</div>
        <div class=""><br class="">
        </div>
        <div class=""><b class="">Intro</b></div>
        <div class=""><br class="">
        </div>
        <div class="">  What we have done is (mostly) extended Python’s
          comprehensions with group by, order by, let and window
          clauses, which can come in any order, thus comprehensions
          become a query language a bit cleaner and more powerful than
          SQL. And we added a couple small convenience extensions, like
          a  We have identified three top motivations for folks to use
          these extensions:</div>
        <div class=""><br class="">
        </div>
        <div class=""><b class="">Our Motivations</b></div>
        <div class=""><br class="">
        </div>
        <div class="">1. This can become a standard for running queries
          against database systems. Instead of learning a large number
          of different SQL dialects (the pain point here are libraries
          of functions and operators that are different for each
          vendor), the Python developer needs only to learn PythonQL and
          he can query any SQL and NoSQL database.</div>
        <div class=""><br class="">
        </div>
        <div class="">2. A single PythonQL expression can integrate a
          number of databases/files/memory structures seamlessly, with
          the PythonQL optimizer figuring out which pieces of plans to
          ship to which databases. This is a cool virtual database
          integration story that can be very convenient, especially now,
          when a lot of data scientists use Python to wrangle the data
          all day long.</div>
        <div class=""><br class="">
        </div>
        <div class="">3. Querying data structures inside Python with the
          full power of SQL (and a bit more) is also really convenient
          on its own. Usually folks that are well-versed in SQL have to
          resort to completely different means when they need to run a
          query in Python on top of some data structures.</div>
        <div class=""><br class="">
        </div>
        <div class=""><b class="">Current Status</b></div>
        <div class=""><br class="">
        </div>
        <div class="">We have PythonQL running, its installed via pip
          and an encoding hack, that runs our preprocessor. We currently
          compile PythonQL into Python using our executor functions and
          execute Python subexpressions via eval. We don’t do any
          optimization / rewriting of queries into languages of
          underlying systems. And the query processor is basic too, with
          naive implementations of operators. But we’ve build DBMS
          systems before, so if there is a good amount of support for
          this project, we’ll be able to build a real system here.</div>
        <div class=""><br class="">
        </div>
        <div class=""><b class="">Your take on this</b></div>
        <div class=""><br class="">
        </div>
        <div class="">Extending Python’s grammar is surely a painful
          thing for the community. We’re now convinced that it is well
          worth it, because of all the wonderful functionality and
          convenience this extension offers. We’d like to get your
          feedback on this and maybe you’ll suggest some next steps for
          us.</div>
        <div class=""><br class="">
        </div>
        <div class=""><b class="">References</b></div>
        <div class=""><br class="">
        </div>
        <div class="">PythonQL GitHub page: <a moz-do-not-send="true" href="https://github.com/pythonql/pythonql" class="">https://github.com/pythonql/pythonql</a></div>
        <div class="">PythonQL Intro and Tutorial (this is all User
          Documentation we have right now): <a moz-do-not-send="true" href="https://github.com/pythonql/pythonql/wiki/PythonQL-Intro-and-Tutorial" class="">https://github.com/pythonql/pythonql/wiki/PythonQL-Intro-and-Tutorial</a></div>
        <div class="">A use-case of querying Event Logs and doing
          Process Mining with PythonQL: <a moz-do-not-send="true" href="https://github.com/pythonql/pythonql/wiki/Event-Log-Querying-and-Process-Mining-with-PythonQL" class="">https://github.com/pythonql/pythonql/wiki/Event-Log-Querying-and-Process-Mining-with-PythonQL</a></div>
        <div class="">PythonQL demo site: <a moz-do-not-send="true" href="http://www.pythonql.org/" class="">www.pythonql.org</a></div>
        <div class=""><br class="">
        </div>
        <div class="">Best regards,</div>
        <div class="">PythonQL Team</div>
        <div class=""><br class="">
        </div>
        <div class=""><br class="">
        </div>
        <div class=""><br class="">
        </div>
        <div class=""><br class="">
        </div>
      </div>
      <br class="">
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br class="">
      <pre wrap="" class="">_______________________________________________
Python-ideas mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Python-ideas@python.org">Python-ideas@python.org</a>
<a class="moz-txt-link-freetext" href="https://mail.python.org/mailman/listinfo/python-ideas">https://mail.python.org/mailman/listinfo/python-ideas</a>
Code of Conduct: <a class="moz-txt-link-freetext" href="http://python.org/psf/codeofconduct/">http://python.org/psf/codeofconduct/</a>
</pre>
    </blockquote>
    <br class="">
  </div>

_______________________________________________<br class="">Python-ideas mailing list<br class=""><a href="mailto:Python-ideas@python.org" class="">Python-ideas@python.org</a><br class="">https://mail.python.org/mailman/listinfo/python-ideas<br class="">Code of Conduct: http://python.org/psf/codeofconduct/<br class=""></div></blockquote></div><br class=""></body></html>