Am 29.05.2013 21:29, schrieb Ed Leafe:
On May 22, 2013, at 7:28 AM, Sibylle
Koczian<[email protected]> wrote:
File "/home/sib/src/dabo-master/dabo/biz/dBizobj.py", line 300, in
__init__ apply(secondary.__init__, (self,) + args, kwargs)
TypeError: __init__() takes exactly 3 arguments (2 given)
What is happening here? What is "secondary" and what is its
__init__ method?
'secondary' is the cursor class for the particular backend; in your
case, Firebird. Apparently the Firebird cursor requires more than the
standard arguments. Can you look at the kinterbasdb and/or fdb code
to see what arguments are required for the cursor class's __init__()
method?
I didn't find that code in the kinterbasdb package - could it be
contained in _kinterbasdb.so?
FDB: The arguments seem to be "connection" and "transaction" (and self,
of course). Could the "transaction" parameter be new?
class Cursor(object):
"""Represents a database cursor, which is used to execute SQL
statement and
manage the context of a fetch operation.
.. important::
DO NOT create instances of this class directly! Use only
:meth:`Connection.cursor`, :meth:`Transaction.cursor` and
:meth:`ConnectionGroup.cursor` to get Cursor instances that
operate in
desired context.
.. note::
Cursor is actually a high-level wrapper around
:class:`PreparedStatement`
instance(s) that handle the actual SQL statement execution and
result
management. Cursor has an internal cache of PreparedStatements,
so when
the same SQL statement is executed repeatedly, related
PreparedStatement
is re-used, which enhances performance. This convenient
enhancement has
a side effect: Cursor that was used to perform many different
SQL statements
may hold very large cache of PerapedStatements. To clear the
cache, you'll
need to call :meth:`clear_cache`.
.. tip::
Cursor supports the iterator protocol, yielding tuples of values
like
:meth:`fetchone`.
"""
#: (Read/Write) As required by the Python DB API 2.0 spec, the
value of this
#: attribute is observed with respect to the :meth:`fetchmany`
method. However,
#: changing the value of this attribute does not make any
difference in fetch
#: efficiency because the database engine only supports fetching a
single row
#: at a time.
arraysize = 1
def __init__(self, connection, transaction):
"""
.. important::
The association between a Cursor and its
:class:`Transaction` and
:class:`Connection` is set when the Cursor is created, and
cannot be
changed during the lifetime of that Cursor.
:param connection: :class:`Connection` instance this cursor
should be bound to.
:param transaction: :class:`Transaction` instance this cursor
should be bound to.
"""
self._prepared_statements = {}
self._connection = connection
self._transaction = transaction
self._ps = None # current prepared statement
Possibly this might be helpful (from the FDB documentation):
Distributed transactions
Support for Distributed Transactions works in slightly differently than
in KDB. FDB uses ConnectionGroup class like KDB with the same interface,
but DT is not bound to main transaction of individual connections
managed by group. That means that Cursor instances obtained from
Connection don’t work in DT if connection is part of ConnectionGroup,
but work normally in connection context. To get Cursor for specific
connection that works in DT, use fdb.ConnectionGroup.cursor() method and
pass the connection as parameter. We believe that this arrangement is
more logical and flexible than KDB’s way.
Transaction context for cursor objects depends on how cursor is
obtained/created:
fdb.Connection.cursor() - Works in context of “main” transaction
for connection.
fdb.Transaction.cursor() - Works in context of this transaction.
fdb.ConnectionGroup.cursor() - Works in context of Distributed
Transaction
Thank you,
Sibylle
_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://mail.leafe.com/mailman/listinfo/dabo-users
Searchable Archives: http://leafe.com/archives/search/dabo-users
This message: http://leafe.com/archives/byMID/[email protected]