datasette / datasette-write-ui

A Datasette plugin that adds UI elements to edit, insert, or delete rows in SQLite tables
Apache License 2.0
15 stars 2 forks source link

500: near "(": syntax error #11

Closed simonw closed 11 months ago

simonw commented 11 months ago

Got this error on /-/datasette-write-ui/edit-row-details?db=data&table=substack_subscribers_7_aug_2023&primaryKeys=2 against this schema:

CREATE TABLE "substack_subscribers_7_aug_2023" (
   [Email] TEXT,
   [Name] TEXT,
   [Emails opened (all time)] INTEGER,
   [Email receives (all time)] INTEGER,
   [Link clicks] INTEGER,
   [Last clicked at] TEXT,
   [Subscription date] TEXT,
   [Subscription type] TEXT,
   [Activity] INTEGER,
   [Revenue] TEXT,
   [Comments (all time)] INTEGER,
   [Comments (last 7 days)] INTEGER,
   [Comments (last 30 days)] INTEGER,
   [Shares (all time)] INTEGER,
   [Shares (last 7 days)] INTEGER,
   [Shares (last 30 days)] INTEGER,
   [Subscriber country] TEXT,
   [Email drops (all time)] INTEGER,
   [Email opens (all time)] INTEGER,
   [Email opens (last 7 days)] INTEGER,
   [Email opens (last 30 days)] INTEGER,
   [Email last opened at] TEXT,
   [Unique emails seen (all time)] INTEGER,
   [Unique emails seen (last 7 days)] INTEGER,
   [Unique emails seen (last 30 days)] INTEGER,
   [Post views (all-time)] INTEGER,
   [Post views (last 7 days)] INTEGER,
   [Post views (last 30 days)] INTEGER,
   [Unique posts seen (all-time)] INTEGER,
   [Unique posts seen (last 7 days)] INTEGER,
   [Unique posts seen (last 30 days)] INTEGER,
   [Subscriptions gifted] INTEGER,
   [Expires at] TEXT,
   [Subscription source (free)] TEXT,
   [Subscription source (paid)] INTEGER,
   [Days active (last 30 days)] INTEGER,
   [First payment at] INTEGER,
   [Paid upgrade date] TEXT,
   [Cancel date] INTEGER,
   [Receiving emails for] TEXT,
   [Domain] TEXT
);

Stacktrace from Sentry:

OperationalError: near "(": syntax error
  File "datasette/app.py", line 1545, in route_path
    response = await view(request, send)
  File "datasette/app.py", line 1727, in async_view_fn
    response = await async_call_with_supported_arguments(
  File "datasette/utils/__init__.py", line 1014, in async_call_with_supported_arguments
    return await fn(*call_with)
  File "__init__.py", line 78, in edit_row_details
    results = await db.execute(
  File "datasette/database.py", line 267, in execute
    results = await self.execute_fn(sql_operation_in_thread)
  File "datasette/database.py", line 213, in execute_fn
    return await asyncio.get_event_loop().run_in_executor(
  File "concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "datasette/database.py", line 211, in in_thread
    return fn(conn)
  File "datasette/database.py", line 237, in sql_operation_in_thread
    cursor.execute(sql, params if params is not None else {})
simonw commented 11 months ago

Here's the problem - the SQL query being executed looked like this:

select
  Email,
  Name,
  Emails opened (all time),
  Email receives (all time),
  Link clicks,
  Last clicked at,
  Subscription date,
  Subscription type,
  Activity,
  Revenue,
  Comments (all time),
  Comments (last 7 days),
  Comments (last 30 days),
  Shares (all time),
  Shares (last 7 days),
  Shares (last 30 days),
  Subscriber country,
  Email drops (all time),
  Email opens (all time),
  Email opens (last 7 days),
  Email opens (last 30 days),
  Email last opened at,
  Unique emails seen (all time),
  Unique emails seen (last 7 days),
  Unique emails seen (last 30 days),
  Post views (all - time),
  Post views (last 7 days),
  Post views (last 30 days),
  Unique posts seen (all - time),
  Unique posts seen (last 7 days),
  Unique posts seen (last 30 days),
  Subscriptions gifted,
  Expires at,
  Subscription source (free),
  Subscription source (paid),
  Days active (last 30 days),
  First payment at,
  Paid upgrade date,
  Cancel date,
  Receiving emails for,
  Domain
from
  substack_subscribers_7_aug_2023
where
  rowid = ?

So it's this code at fault: https://github.com/datasette-io/datasette-write-ui/blob/be15b510feea4b33345c790f8eec7fab1b2c25d9/datasette_write_ui/__init__.py#L75-L80

asg017 commented 11 months ago

Closed by #11