[GENERAL] Python DB-API 2.0 oddity (was: I receieved an example of Rekall script)

2005-05-02 Thread Karsten Hilbert
A note on what I think is a strangeness in the Python DB-API 2.0.
Please correct me if I am wrong.

(Note that I am not trying to throw off the OP but simply use
his example to point out an oddity about that API. The point
is to make sure it *is* an oddity so I can raise it with the
appropriate forum, eg the Python community.)

Observe the following notes by someone learning the DB-API:

 # Get a cursor. We do this by connecting to the database: the
 # (button,) arguments just connect to the database that the form  is
 # running in.
 #
 cursor =  RekallPYDBI.connect (button, '').cursor()
So far so good... But - getting a cursor without knowing the
SELECT query the results of which it stands for ?

 # Execute a  query. This only gets people whose ages are 21 or above.
 # This  is the important bit, we are accessing the database directly.
 #
 cursor.execute (select surname from users where age =  ?, [21])
Ah, the query is set *after* getting a cursor for it - seems
odd, but hey, as long as it's set before retrieving rows ...

 The key is getting the cursor. Once you have a cursor  you can do inserts, 
 updates and deletes, like
Huh ? Pardon me ? Doing inserts, updates and deletes via a
cursor ? The PostgreSQL documentation clearly says that the
query part of a cursor definition must be a SELECT:

http://www.postgresql.org/docs/7.4/static/sql-declare.html

(I am well aware that SELECT queries may have side
effects that change data in the backend such as in
select add_new_customer() etc.)

The sequence of using a cursor in the Python DB-API is as
follows:

 conn = dbapi.connect(...)
 curs = conn.cursor()
 curs.execute('[select | insert | update | delete] ...')
 print curs.fetch(no_of_rows)   # if query was a select

This seems mighty odd to me. Should it not be:

 # get connection
 conn = dbapi.connect(...)
 # select w/o cursor so we get entire result set right away
 rows = conn.execute('select ...', use_cursor = False)
 # select w/ cursor so we can traverse result set as needed
 curs = conn.execute('select ...'), use_cursor = True)
 rows = curs.fetch(no_of_rows=25)
 # insert
 conn.execute('insert ...')
 # update
 conn.execute('update ...')
 # delete
 conn.execute('delete ...')

Wondering,
Karsten
-- 
GPG key ID E4071346 @ wwwkeys.pgp.net
E167 67FD A291 2BEA 73BD  4537 78B9 A9F9 E407 1346

---(end of broadcast)---
TIP 9: the planner will ignore your desire to choose an index scan if your
  joining column's datatypes do not match


Re: [GENERAL] Python DB-API 2.0 oddity (was: I receieved an example of

2005-05-02 Thread Marco Colombo
On Mon, 2005-05-02 at 11:56 +0200, Karsten Hilbert wrote:
 A note on what I think is a strangeness in the Python DB-API 2.0.
 Please correct me if I am wrong.
 
 (Note that I am not trying to throw off the OP but simply use
 his example to point out an oddity about that API. The point
 is to make sure it *is* an oddity so I can raise it with the
 appropriate forum, eg the Python community.)
 
 Observe the following notes by someone learning the DB-API:
 
  # Get a cursor. We do this by connecting to the database: the
  # (button,) arguments just connect to the database that the form  is
  # running in.
  #
  cursor =  RekallPYDBI.connect (button, '').cursor()
 So far so good... But - getting a cursor without knowing the
 SELECT query the results of which it stands for ?

AFAIK cursors are not limited to SELECTs.

  # Execute a  query. This only gets people whose ages are 21 or above.
  # This  is the important bit, we are accessing the database directly.
  #
  cursor.execute (select surname from users where age =  ?, [21])
 Ah, the query is set *after* getting a cursor for it - seems
 odd, but hey, as long as it's set before retrieving rows ...
 
  The key is getting the cursor. Once you have a cursor  you can do 
  inserts, 
  updates and deletes, like
 Huh ? Pardon me ? Doing inserts, updates and deletes via a
 cursor ? The PostgreSQL documentation clearly says that the
 query part of a cursor definition must be a SELECT:
 
 http://www.postgresql.org/docs/7.4/static/sql-declare.html

But what makes you think that Python DBI was designed to be PostgreSQL
specific?

http://www.python.org/peps/pep-0249.html

.cursor()
  
Return a new Cursor Object using the connection.  If the
database does not provide a direct cursor concept, the
module will have to emulate cursors using other means to
the extent needed by this specification.

It's up to the module implementation to use real SQL cursors when
possible. AFAIK, it's not done automagically for PostgreSQL.
In practice, DBI cursor objects and SQL cursors have little in common
in the PostgreSQL drivers I'm aware of (PygreSQL and psycopg). A DBI
cursor is just an handle to execute SQL commands.

.TM.
-- 
  /  /   /
 /  /   /   Marco Colombo
___/  ___  /   /  Technical Manager
   /  /   /  ESI s.r.l.
 _/ _/  _/  [EMAIL PROTECTED]


---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])


Re: [GENERAL] Python DB-API 2.0 oddity (was: I receieved an example of

2005-05-02 Thread Marco Colombo
On Mon, 2005-05-02 at 11:56 +0200, Karsten Hilbert wrote:

  The key is getting the cursor. Once you have a cursor  you can do 
  inserts, 
  updates and deletes, like
 Huh ? Pardon me ? Doing inserts, updates and deletes via a
 cursor ? The PostgreSQL documentation clearly says that the
 query part of a cursor definition must be a SELECT:
 
 http://www.postgresql.org/docs/7.4/static/sql-declare.html
 
 (I am well aware that SELECT queries may have side
 effects that change data in the backend such as in
 select add_new_customer() etc.)
 

BTW, look at this page (with the Oracle driver):

http://www.zope.org/Members/matt/dco2/dco2doc

  cursor.execute(INSERT INTO TEST (name, id) VALUES (:name, :id),
  name=Matt Kromer, id=1)

I believe there are databases that allow you to send SQL statements (any
kind, not only SELECTs) only in a cursor (either implicit or explicit),
hence the name for the cursor object.

.TM.
-- 
  /  /   /
 /  /   /   Marco Colombo
___/  ___  /   /  Technical Manager
   /  /   /  ESI s.r.l.
 _/ _/  _/  [EMAIL PROTECTED]


---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]