Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

raw_sql in function scope can't resolve parameters #145

Closed
tonycpsu opened this issue Sep 22, 2015 · 2 comments
Closed

raw_sql in function scope can't resolve parameters #145

tonycpsu opened this issue Sep 22, 2015 · 2 comments
Assignees
Labels
Milestone

Comments

@tonycpsu
Copy link

Test code:

from pony.orm import *

db = Database('sqlite', ':memory:')

class Foo(db.Entity):
    foo_id = PrimaryKey(int, auto=True)
    name = Required(str)

    def __repr__(self):
        return "<Foo: %s>" %(self.name)


db.generate_mapping(create_tables=True)

def foo():
    with db_session:

        f = Foo(name="aaa")
        f = Foo(name="aab")
        f = Foo(name="abb")
        f = Foo(name="abc")

        search = "ab%"

        results = select(
            f for f in Foo
            if raw_sql("name LIKE $(search)")
        )

        print list(results)

foo()

Results in:

pony.orm.core.ExprEvalError: (search) raises NameError: name 'search' is not defined

Even though search is in scope. Taking the function body out of the foo() function and executing it in the main body of the test script works fine.

@kozlovsky kozlovsky added the bug label Oct 2, 2015
@kozlovsky kozlovsky added this to the 0.6.2 milestone Oct 2, 2015
@kozlovsky kozlovsky self-assigned this Oct 2, 2015
@kozlovsky
Copy link
Member

Thanks for reporting!

In order to fix this issue as well as several other issues, we completely rewrote raw_sql() implementation. Now it is possible to do the following:

  1. Use $parameters inside a raw_sql string:
s = 'J%'
select(p for p in Person if raw_sql('p.name LIKE $s'))
  1. Inline complex Python expressions into raw_sql fragments:
import datetime
select(t for t in Task if raw_sql("t.due_date < date($datetime.date.today(), '+1 day')"))
  1. Use dynamically generated strings as a parameter to raw_sql:
x = 100
s = '"p"."price" > $x'
select(p for p in Product if raw_sql(s))

or

x = 100
s = '"p"."price" > $x'
raw = raw_sql(s)
select(p for p in Product if raw)
  1. raw_sql as a query result:
select(raw_sql('UPPER(p.name)') for p in Person)

See tests for more examples: https://github.com/ponyorm/pony/blob/orm/pony/orm/tests/test_raw_sql.py

@tonycpsu
Copy link
Author

tonycpsu commented Oct 7, 2015

Looks great to me so far -- thanks!

kozlovsky added a commit that referenced this issue Jan 11, 2016
The documentation was moved from this repo to a separate one at https://github.com/ponyorm/pony-doc
The compiled version can be found at https://docs.ponyorm.com

# New features

* Python 3.5 support
* #132, #145: raw_sql() function was added
* #126: Ability to use @db_session with generator functions
* #116: Add support to select by UUID
* Ability to get string SQL statement using the Query.get_sql() method
* New function delete(gen) and Query.delete(bulk=False)
* Now it is possible to override Entity.__init__() and declare custom entity methods

# Backward incompatible changes

* Normalizing table names for symmetric relationships
* Autostrip - automatically remove leading and trailing characters

# Bugfixes

* #87: Pony fails with pymysql installed as MySQLdb
* #118: Pony should reconnect if previous connection was created before process was forked
* #121: Unable to update value of unique attribute
* #122: AssertionError when changing part of a composite key
* #127: a workaround for incorrect pysqlite locking behavior
* #136: Cascade delete does not work correctly for one-to-one relationships
* #141, #143: remove restriction on adding new methods to entities
* #142: Entity.select_random() AssertionError
* #147: Add 'atom_expr' symbol handling for Python 3.5 grammar
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants