Title: Add support for printing SQL of SQLAlchemy query · Issue #23 · pgvector/pgvector-python · GitHub
Open Graph Title: Add support for printing SQL of SQLAlchemy query · Issue #23 · pgvector/pgvector-python
X Title: Add support for printing SQL of SQLAlchemy query · Issue #23 · pgvector/pgvector-python
Description: pgvector.sqlalchemy.Vector doesn't provide a process_literal_param method, so any SQLALchemy query containing literal values for such column will fail to be rendered to final SQL including the values when literal_binds are enabled. Pleas...
Open Graph Description: pgvector.sqlalchemy.Vector doesn't provide a process_literal_param method, so any SQLALchemy query containing literal values for such column will fail to be rendered to final SQL including the valu...
X Description: pgvector.sqlalchemy.Vector doesn't provide a process_literal_param method, so any SQLALchemy query containing literal values for such column will fail to be rendered to final SQL including the ...
Opengraph URL: https://github.com/pgvector/pgvector-python/issues/23
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Add support for printing SQL of SQLAlchemy query","articleBody":"`pgvector.sqlalchemy.Vector` doesn't provide a `process_literal_param` method, so any SQLALchemy query containing literal values for such column will fail to be rendered to final SQL including the values when `literal_binds` are enabled. Please implement the method.\r\n\r\nRepro steps:\r\n```\r\nimport sqlalchemy as sa\r\nimport sqlalchemy.dialects.postgresql\r\nimport pgvector.sqlalchemy as pgv\r\n\r\nengine = sa.create_engine(\"postgresql+psycopg2://postgres:password@localhost:5432/neighbors-2\")\r\nconn = engine.connect()\r\ntable = sa.Table(\"foo\", sa.MetaData(), sa.Column(\"col1\", pgv.Vector(4)))\r\nquery = sa.select(table.c.col1).where((table.c.col1.max_inner_product([0.5, 0.5, 0.5, 0.5]) * -1) \u003e= 0.1)\r\nkwargs = {\"literal_binds\": True}\r\nsql = str(query.compile(dialect=sqlalchemy.dialects.postgresql.dialect()), compile_kwargs=kwargs)\r\n```\r\nraises\r\n```\r\nsqlalchemy.exc.CompileError: No literal value renderer is available for literal value \"[0.5, 0.5, 0.5, 0.5]\" with datatype VECTOR(4)\r\n```\r\n(The query itself is OK which can be verified by using `kwargs = {}` -- the compilation returns `'SELECT foo.col1 \\nFROM foo \\nWHERE (foo.col1 \u003c#\u003e %(col1_1)s) * %(param_1)s \u003e= %(param_2)s'`)\r\n\r\nWorkaround:\r\n```\r\nimport pgvector.utils\r\n\r\nclass Vector(pgv.Vector, sa.TypeDecorator):\r\n impl = pgv.Vector\r\n cache_ok = True\r\n\r\n def process_literal_param(self, value, dialect):\r\n return repr(pgvector.utils.to_db(value, self.dim))\r\n```\r\nand use this wrapper class in the table definition instead of the library-provided `pgv.Vector`. The SQL rendering then works:\r\n```\r\nstr(query.compile(dialect=sqlalchemy.dialects.postgresql.dialect(), compile_kwargs={\"literal_binds\": True}))\r\n\"SELECT foo.col1 \\nFROM foo \\nWHERE (foo.col1 \u003c#\u003e '[0.5,0.5,0.5,0.5]') * -1 \u003e= 0.1\"\r\n```","author":{"url":"https://github.com/sarimak","@type":"Person","name":"sarimak"},"datePublished":"2023-08-07T08:40:02.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":4},"url":"https://github.com/23/pgvector-python/issues/23"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:c0ebe844-13b2-4974-a235-8d21c4597e61 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | CA92:2A07B7:67329D1:85F86FB:69756B53 |
| html-safe-nonce | 5d72ef68c4caf72ac95e6976c78943290bd9d4e5595704e62a7e6821d8d1bcc2 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQTkyOjJBMDdCNzo2NzMyOUQxOjg1Rjg2RkI6Njk3NTZCNTMiLCJ2aXNpdG9yX2lkIjoiMzgxMzI5OTA2Nzg0ODg0NjE2MyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | c92ca65160a4696c19893257527956b1bf105dcd46db23218b1a99049e7fe20c |
| hovercard-subject-tag | issue:1838970589 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/pgvector/pgvector-python/23/issue_layout |
| twitter:image | https://opengraph.githubassets.com/0a84b26fd5ae7caacfac8dbed2398a490a465dcbf9d2d6372fd3235ecda63d58/pgvector/pgvector-python/issues/23 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/0a84b26fd5ae7caacfac8dbed2398a490a465dcbf9d2d6372fd3235ecda63d58/pgvector/pgvector-python/issues/23 |
| og:image:alt | pgvector.sqlalchemy.Vector doesn't provide a process_literal_param method, so any SQLALchemy query containing literal values for such column will fail to be rendered to final SQL including the valu... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | sarimak |
| hostname | github.com |
| expected-hostname | github.com |
| None | 4a4bf5f4e28041a9d2e5c107d7d20b78b4294ba261cab243b28167c16a623a1f |
| turbo-cache-control | no-preview |
| go-import | github.com/pgvector/pgvector-python git https://github.com/pgvector/pgvector-python.git |
| octolytics-dimension-user_id | 98363230 |
| octolytics-dimension-user_login | pgvector |
| octolytics-dimension-repository_id | 376300726 |
| octolytics-dimension-repository_nwo | pgvector/pgvector-python |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 376300726 |
| octolytics-dimension-repository_network_root_nwo | pgvector/pgvector-python |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 488b30e96dfd057fbbe44c6665ccbc030b729dde |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width