Re: Inserting default values into execute_values

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: Inserting default values into execute_values
Дата
Msg-id 6db34cfa-c531-18ff-4368-bea8c171f6db@aklaver.com
обсуждение исходный текст
Ответ на Inserting default values into execute_values  (Stephen Lagree <stephen.lagree@gmail.com>)
Ответы Re: Inserting default values into execute_values  (Adrian Klaver <adrian.klaver@aklaver.com>)
Список psycopg
On 3/31/20 3:27 PM, Stephen Lagree wrote:
> Hello,
> 
> I am trying to insert into a table to generate sequential ids.  Is there 
> a way to do this repeatedly using execute_values if there is only one 
> column and it is auto incremented?
> It seems the execute_values requires at least one non-default value.
> 
> I am trying to do this:
>      query = "INSERT INTO MYTABLE (id) VALUES (DEFAULT) RETURNING id;"
>      execute_values(cursor, query, args_list, template=None, 
> page_size=100, fetch=True)
> 
> If I don't use a %s argument and just put dummy values in the arglist, I 
> get error
> E           ValueError: the query doesn't contain any '%s' placeholder
> I understand why this doesn't work because it can't extract the 
> placeholder and replicate values there.
> 
> If I change DEFAULT to %s and try to use blank tuples I get this
> E           psycopg2.errors.SyntaxError: syntax error at or near ")"
> E           LINE 1: INSERT INTO MYTABLE (id) VALUES (),(),() RETURNING id;
> 
> If I use "DEFAULT" as a string it tries to insert a string into an int 
> column, not use the DEFAULT value.  Is there a way to insert the default 
> value here?  I don't see anything like this in the documentation.
> 
> My table looks like this:
> "CREATE TABLE MYTABLE (id SERIAL PRIMARY KEY)"


A solution from Daniele Varrazzo.  I can't find the mailing list post 
where it appeared, just where I use it in code:

Given a file:

utilities/psycopg_helpers.py

"""Psycopg2 helper code.

Code for extending psycopg2.
"""

import psycopg2


class Default(object):
     """Set up DEFAULT value for a field.

     When doing INSERT or UPDATE in Postgres one can use DEFAULT/default 
    as the value to have the server use the default set on the field. 
The below allows
     for doing that.
     """
     def __conform__(self, proto):
         if proto is psycopg2.extensions.ISQLQuote:
             return self

     def getquoted(self):
         return 'DEFAULT'


DEFAULT = Default()


Then import it:

from .utilities.psycopg_helpers import DEFAULT

and use DEFAULT where you want a SQL DEFAULT.

> 
> Thanks,
> Steve


-- 
Adrian Klaver
adrian.klaver@aklaver.com



В списке psycopg по дате отправления:

Предыдущее
От: Stephen Lagree
Дата:
Сообщение: Inserting default values into execute_values
Следующее
От: Adrian Klaver
Дата:
Сообщение: Re: Inserting default values into execute_values