pgspecial icon indicating copy to clipboard operation
pgspecial copied to clipboard

\d schema.table crashes

Open dpriedel opened this issue 6 years ago • 1 comments

I am using the latest version of pgspecial with postgresql 11.5 on Manjaro Linux.

I am using pgspecial from ipython-sql

Once I connect to my DB, I can run commands such as:

%sql \dn pg_catalog

and get proper output

But, if I try to run a command such as:

%sql \d pg_catalog.pg_class

it crashes with the following stack trace

`

AttributeError Traceback (most recent call last) in ----> 1 get_ipython().run_line_magic('sql', '\d pg_catalog.pg_class')

/usr/lib/python3.7/site-packages/IPython/core/interactiveshell.py in run_line_magic(self, magic_name, line, _stack_depth) 2312 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals 2313 with self.builtin_trap: -> 2314 result = fn(*args, **kwargs) 2315 return result 2316

</usr/lib/python3.7/site-packages/decorator.py:decorator-gen-127> in execute(self, line, cell, local_ns)

/usr/lib/python3.7/site-packages/IPython/core/magic.py in (f, *a, **k) 185 # but it's overkill for just that one bit of state. 186 def magic_deco(arg): --> 187 call = lambda f, *a, **k: f(*a, **k) 188 189 if callable(arg):

</usr/lib/python3.7/site-packages/decorator.py:decorator-gen-126> in execute(self, line, cell, local_ns)

/usr/lib/python3.7/site-packages/IPython/core/magic.py in (f, *a, **k) 185 # but it's overkill for just that one bit of state. 186 def magic_deco(arg): --> 187 call = lambda f, *a, **k: f(*a, **k) 188 189 if callable(arg):

/usr/lib/python3.7/site-packages/sql/magic.py in execute(self, line, cell, local_ns) 93 94 try: ---> 95 result = sql.run.run(conn, parsed['sql'], self, user_ns) 96 97 if result is not None and not isinstance(result, str) and self.column_local_vars:

/usr/lib/python3.7/site-packages/sql/run.py in run(conn, sql, config, user_namespace) 335 _, cur, headers, _ = pgspecial.execute( 336 conn.session.connection.cursor(), statement)[0] --> 337 result = FakeResultProxy(cur, headers) 338 else: 339 txt = sqlalchemy.sql.text(statement)

/usr/lib/python3.7/site-packages/sql/run.py in init(self, cursor, headers) 298 299 def init(self, cursor, headers): --> 300 self.fetchall = cursor.fetchall 301 self.fetchmany = cursor.fetchmany 302 self.rowcount = cursor.rowcount

AttributeError: 'list' object has no attribute 'fetchall' `

It doesn't matter what table I use.

dpriedel avatar Sep 11 '19 20:09 dpriedel

Comming back to this and spending some time debugging, what I found is that the outputs from this call: _, cur, headers, _ = pgspecial.execute(conn.session.connection.cursor(), statement)[0] are not compatible with the inputs to this call: result = FakeResultProxy(cur, headers)

Specifically, the variable 'cur' contains a list of the rows returned from running the command NOT a cursor. The FakeResultProxy class expects a cursor in the 'cur' variable.

I hacked a work-around so I can use this but I doubt it's a real fix.

dpriedel avatar Oct 17 '19 12:10 dpriedel