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

implement named parameterized queries #201

Open
WolfgangFahl opened this issue Oct 10, 2024 · 8 comments
Open

implement named parameterized queries #201

WolfgangFahl opened this issue Oct 10, 2024 · 8 comments

Comments

@WolfgangFahl
Copy link

see e.g. https://github.com/WolfgangFahl/pyLoDStorage/blob/master/lodstorage/params.py

which does jinja compatible parameter handling and is used in https://github.com/WolfgangFahl/snapquery

with demos at https://snapquery.bitplan.com/ and https://genwiki2024.bitplan.com/

grafik grafik
@dnicolodi
Copy link
Collaborator

From the provided links I'm not able to understand what the feature you are asking would be doing. The examples provided are web GUIs for running some sort of queries. beanquery does not have a GUI, only an interactive shell. How do you foresee this feature to work in the interactive shell? beanquery does not even have a very well defined concept of named queries. It can load named queries defined in Beancount ledgers with the query directive. Are you proposing to extend this facility with the possibility of passing parameters to the queries stored in Beancount ledgers? How would the user interface for this functionality look like?

In particular, I don't understand the reference to "ninja compatible parameter handling". This seems to imply that query parameters are interpolated textually into the query string. This is a very bad idea and results in having to deal with escaping of the substituted parameters when composing the query, which is very fragile. beanquery has support for parametrized queries like most SQL client implementations that does not rely on textual manipulation of the query string.

@WolfgangFahl
Copy link
Author

WolfgangFahl commented Oct 10, 2024

the GUI screen shots are only for illustration Take e.g. https://snapquery.bitplan.com/query/scholia.toolforge.org/named_queries/author_list-of-publications which is derived from https://github.com/WDscholia/scholia/blob/master/scholia/app/templates/author_list-of-publications.sparql

this query has a single parameter with the name "q" which is used in the line

PREFIX target: <http://www.wikidata.org/entity/{{ q }}>

now the named parameterized query has the flexibility to create queries on any wikidataitem with the identifier q e.g Q80 - Tim Berners Lee. So a named parameterized query is a query template.

In beancount e.g. a paramater {{year}} might be useful.

In my apps i use yaml for the declaration of the queries e.g. https://github.com/WolfgangFahl/genwiki2024/blob/main/genwiki_examples/queries.yaml

if beancount would have the same interface my UIs would work out of the box and we could even use a beancount RESTful server as an endpoint.

@dnicolodi
Copy link
Collaborator

beanquery supports queries with parameters. parameters placeholders have the same style as defined in the Python DB-API with paramstyles format or pyformat as implemented for example by the psicopg https://www.psycopg.org/psycopg3/docs/basic/params.html

IIUC, the main difference from what you propose is that the parameters are textually replaced in the query string. What beanquery does (and what other SQL and SQL-like client libraries do) is to use placeholders that are bound to values at query execution time.

beanquery is not going to provide a text substitution implementation of query parameters.

@dnicolodi
Copy link
Collaborator

I still don't understand why what you want to do needs support in beanquery. If you want your query front-end to do textual interpolation of query parameters, just pass the query string through string.Template() on ninja or something that does the interpolation.

@WolfgangFahl
Copy link
Author

Thanks i will happily try this out. Currently my main obstacle is the incompatibility of beancount 3 and beancount 2 - how can i use beanquery as a component without automatically getting beancount2 ? Could you make beanquery available as a separate pypi release?

@dnicolodi
Copy link
Collaborator

I don't understand what you mean. beanquery is a separate package.

@WolfgangFahl
Copy link
Author

WolfgangFahl commented Nov 2, 2024

I found https://pypi.org/project/beanquery/ with This is a fork of beancount.query that is intended to eventually replace it. This is currently work in progress. The dev0 label the statement and the missing badges in the README (see #209) confused me a bit. I am now going to try to use it.

dev0 is something have note encountered before. I learned:
0.1.dev0 is a valid semantic version for PyPI. According to PEP 440, which defines the versioning scheme for Python packages, 0.1.dev0 is compliant as a development release. The .devN suffix is used to denote a developmental release preceding the base version 0.1.

_ >=0.1 will not match 0.1.dev0 in pyproject.toml. According to PEP 440, development releases (e.g., 0.1.dev0) are considered to be earlier than their corresponding base release (e.g., 0.1). Therefore, the constraint >=0.1 will only match versions that are 0.1 or higher, excluding any development releases before 0.1._

so i am going with any beanquery version for the time being.

@dnicolodi
Copy link
Collaborator

The attentive observer would have spotted the fact that the "Homepage" link of the package on PyPI points to exactly this GitHub repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants