Hi devs,

I added %% into my DDL and sqlalchemy raises the TypeError:  'dict'
object does not support indexing.

The critical part is:

 row_array t_record%%ROWTYPE in the DDL.

Em I using the DDL correctly? I read that I need to double the '%'
character and I did that.

Best regards
Petr Kobalicek




The callable code is here (using postgres):
--------------------------------------

#!/usr/bin/env python

from sqlalchemy import MetaData
from sqlalchemy import Table, Column

from sqlalchemy import Integer, Boolean
from sqlalchemy import Unicode, UnicodeText
from sqlalchemy import DDL

from sqlalchemy import engine_from_config
from sqlalchemy import func
from sqlalchemy import select

from sqlalchemy import orm
from sqlalchemy import text

metadata = MetaData()

RecordTable = Table('t_record', metadata,
  Column('record_id', Integer, primary_key = True),
  Column('idx', Integer, default=None),
  Column('msg', UnicodeText)
)

sql_create = DDL(
  "\n"

  "CREATE OR REPLACE FUNCTION t_record_new()\n"
  "  RETURNS trigger AS\n"
  "$BODY$\n"
  "  BEGIN\n"
  "    NEW.idx := (SELECT COUNT(r.idx) AS t FROM t_record AS r);\n"
  "    RETURN NEW;\n"
  "  END;\n"
  "$BODY$\n"
  "LANGUAGE 'plpgsql';\n"

  "\n"

  "CREATE OR REPLACE FUNCTION t_record_up(param_id BIGINT)\n"
  "  RETURNS void AS\n"
  "$BODY$\n"
  "  DECLARE\n"
  "    r INT;\n"
  "    row_array t_record%%ROWTYPE;\n"
  "  BEGIN\n"
  "    -- Get index of the row we need to move.\n"
  "    SELECT t_record.idx\n"
  "      FROM t_record\n"
  "      WHERE t_record.record_id = $1\n"
  "      INTO r;\n"
  "    \n"
  "    FOR row_array IN SELECT *\n"
  "      FROM t_record\n"
  "      WHERE t_record.idx >= r\n"
  "      ORDER_BY t_record.idx\n"
  "      LIMIT 2\n"
  "    LOOP\n"
  "      \n"
  "    END LOOP;\n"
  "    \n"
  "    UPDATE t_record\n"
  "      SET idx=111\n"
  "      WHERE t_record.record_id = $1;\n"
  "    \n"
  "    RETURN;\n"
  "  END;\n"
  "$BODY$\n"
  "LANGUAGE 'plpgsql';\n"
  "\n"

  "CREATE TRIGGER t_record_new BEFORE INSERT ON t_record\n"
  "FOR EACH ROW\n"
  "  EXECUTE PROCEDURE t_record_new();\n"
)
sql_create.execute_at('after-create', RecordTable)

sql_drop = DDL(
  "\n" +

  "DROP TRIGGER IF EXISTS t_record_new ON t_record;\n" +
  "DROP FUNCTION IF EXISTS t_record_new();\n"
)
sql_drop.execute_at('before-drop', RecordTable)

class RecordModel(object):
  def __init__(self, msg = u""):
    self.msg = msg

  def __repr__(self):
    return u"REC - Idx(" + unicode(self.idx) + u"), Msg(" + self.msg + u")"

def printRecords():
  print u"\nRECORDS:"
  rows = session.execute(select([RecordTable])).fetchall()
  for row in rows: \
    print u"REC - Idx(" + unicode(row.idx) + u"), Msg(" + row.msg + u")"

orm.mapper(RecordModel, RecordTable,
  properties = {
    "id": RecordTable.c.record_id,
    "msg": RecordTable.c.msg
  }
)

engine = engine_from_config({
  "sqlalchemy.url": "postgresql://someuser:somep...@localhost/somedb",
  "sqlalchemy.convert_unicode": True,
  "sqlalchemy.echo": True
}, prefix="sqlalchemy.")
metadata.bind = engine

metadata.drop_all(checkfirst=True)
metadata.create_all()

sm = orm.sessionmaker(bind = engine, autoflush = True)
session = orm.scoped_session(sm)




The full error log:
--------------------------------------

Traceback (most recent call last):
  File "C:\My\Devel\Web\Test\sqla_readonly.py", line 114, in <module>
    metadata.create_all()
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\schema
.py", line 2013, in create_all
    bind.create(self, checkfirst=checkfirst, tables=tables)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\base.py", line 1647, in create
    connection=connection, **kwargs)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\base.py", line 1682, in _run_visitor
    **kwargs).traverse_single(element)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\sql\vi
sitors.py", line 77, in traverse_single
    return meth(obj, **kw)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\ddl.py", line 42, in visit_metadata
    self.traverse_single(table, create_ok=True)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\sql\vi
sitors.py", line 77, in traverse_single
    return meth(obj, **kw)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\ddl.py", line 65, in visit_table
    listener('after-create', table, self.connection)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\schema
.py", line 2200, in __call__
    return bind.execute(self.against(target))
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\base.py", line 1157, in execute
    params)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\base.py", line 1210, in _execute_ddl
    return self.__execute_context(context)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\base.py", line 1268, in __execute_context
    context.parameters[0], context=context)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\base.py", line 1360, in _cursor_execute
    context)
  File "C:\Python\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\engine
\default.py", line 288, in do_execute
    cursor.execute(statement, parameters)
TypeError: 'dict' object does not support indexing

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to