Psycopg2 date problems: "Can't adapt"

S

Steve Holden

I'm trying to copy data from an Access database to PostgreSQL, as the
latter now appears to work well in the Windows environment. However I'm
having trouble with date columns.

The PostgreSQL table receiving the data has the following definition:

CREATE TABLE Lines (
LinID SERIAL PRIMARY KEY,
LinDate TIMESTAMP(0),
LinQty INTEGER,
LinPrdID INTEGER ,
LinPrice NUMERIC(8,2),
LinInvoice INTEGER)

Here's the problem in a nutshell:
'INSERT INTO Lines(LinID, LinDate, LinQty, LinPrdID, LinPrice,
LinInvoice) VALUES(%s, %s, %s, %s, %s, %s)'Traceback (most recent call last):

Since the date value's the only difference between the two, I deduce
it's causing the problem.

I'd rather not have to manipulate the data (in other words, I'd rather
just change the definition of the receiving table to avoid the error if
possible), as the copying operation attempts to be table-independent. It
currently reads:

for tbl, cols in d.items():
print "Copying", tbl
dsql = "DELETE FROM %s" % tbl
ocurs.execute(dsql)
isql = "SELECT %s FROM %s" % (", ".join(cols), tbl)
osql = "INSERT INTO %s(%s) VALUES(%s)" % (
tbl, ", ".join(cols), ", ".join("%s" for c in cols))
print isql, '\n', osql
icurs.execute(isql)
for row in icurs.fetchall():
ocurs.execute(osql, row)

Though until I started stepping through the data row by row the last two
lines were replaced by

ocurs.executemany(osql, icurs.fetchall())

Who can help me past this little sticking point?

regards
Steve
 
B

bonono

Is "None" a valid value for SQL ? Or should it be NULL ? May be it is
because your input is NULL which is being converted to None in python
but haven't been converted back to NULL on its way out.
 
S

Steve Holden

Steve said:
I'm trying to copy data from an Access database to PostgreSQL, as the
latter now appears to work well in the Windows environment. However I'm
having trouble with date columns.

The PostgreSQL table receiving the data has the following definition:

CREATE TABLE Lines (
LinID SERIAL PRIMARY KEY,
LinDate TIMESTAMP(0),
LinQty INTEGER,
LinPrdID INTEGER ,
LinPrice NUMERIC(8,2),
LinInvoice INTEGER)

Here's the problem in a nutshell:
ocurs.execute("DELETE FROMI Lines")
osql
'INSERT INTO Lines(LinID, LinDate, LinQty, LinPrdID, LinPrice,
LinInvoice) VALUES(%s, %s, %s, %s, %s, %s)'
ocurs.execute(osql, (1, d, 1, 1, 12500.0, 88))
Traceback (most recent call last):
File said:
ocurs.execute(osql, (1, None, 1, 1, 12500.0, 88))

Since the date value's the only difference between the two, I deduce
it's causing the problem.
[...]
> Is "None" a valid value for SQL ? Or should it be NULL ? May be it is
> because your input is NULL which is being converted to None in python
> but haven't been converted back to NULL on its way out.
>
Python's None is the way you communicate null values through the query
parameterisation mechanism. You will observe that the statement with the
None value for the date field runs fine, and the error occurs when I
provide an actual date object.

regards
Steve
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top