Michael Bayer wrote: > my guess is that its confusing the names "virtualization" between the > table and column name. im guessing the "field" you send to > order_by() is a string
Correct. I really have not much choice in the matter without somewhat tedious programming, because column for "order by" comes from web app input, and so it's obviously most straightforward to use a string... > otherwise it would render it as > tablename.columnname and would be quoted for the upper cased > Virtualization. The thing is, for PG it would be useful to double-quote strings as well: It turns out to be Postgres-specific problem, I asked on PG-general users group and the reply is that it is standard quirk of Postgres: "Quoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case" http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS This is works-as-designed problem: reservations=# SELECT * FROM virtualization ORDER BY Virtualization; ERROR: could not identify an ordering operator for type virtualization HINT: Use an explicit ordering operator or modify the query. reservations=# SELECT * FROM virtualization ORDER BY virtualization.Virtualization; ERROR: column virtualization.virtualization does not exist But: reservations=# SELECT * FROM virtualization ORDER BY "Virtualization"; id | Virtualization | color ----+-----------------+--------- 1 | BOX | #FAFAFA 17 | BOX | #FAFAFA 9 | BOX ESX HOST | #FAFAFA 7 | BOX MSVS HOST | #FAFAFA 18 | BOX MSVS HOST | #FAFAFA So there's a humble request/proposal from me for you: would it be possible for SQLA to always quote column names in ORDER BY clauses for PG backend, even when it's a string? In the meantime I will probably just rename the columns to lowercase... Regards, mk > > > > On Mar 31, 2009, at 5:44 AM, Marcin Krol wrote: > >> Hello everyone, >> >> Now that I have my PG db filled, I'm encountering this exception while >> trying to use it: >> >> ProgrammingError: (ProgrammingError) could not identify an ordering >> operator for type virtualization >> >> HINT: Use an explicit ordering operator or modify the query. >> >> 'SELECT hosts.id AS hosts_id, hosts."IP" AS "hosts_IP", >> hosts."HostName" AS "hosts_HostName", hosts."Location" AS >> "hosts_Location", hosts."Architecture_id" AS "hosts_Architecture_id", >> hosts."OS_Kind_id" AS "hosts_OS_Kind_id", hosts."OS_version_id" AS >> "hosts_OS_version_id", hosts."Additional_info" AS >> "hosts_Additional_info", hosts."Column_12" AS "hosts_Column_12", >> hosts."Column_13" AS "hosts_Column_13", hosts."Email_id" AS >> "hosts_Email_id", hosts."Username" AS "hosts_Username", >> hosts."Password" >> AS "hosts_Password", hosts."Alias" AS "hosts_Alias", >> hosts."Virtualization_id" AS "hosts_Virtualization_id", >> hosts."Shareable" AS "hosts_Shareable", >> hosts."Shareable_between_projects" AS >> "hosts_Shareable_between_projects", hosts."Notes" AS "hosts_Notes", >> hosts."CPU" AS "hosts_CPU", hosts."RAM" AS "hosts_RAM", >> hosts."Column_24" AS "hosts_Column_24", hosts."Batch" AS >> "hosts_Batch", >> hosts."ASSET" AS "hosts_ASSET", hosts."Owner" AS "hosts_Owner", >> hosts."SSH_KEY_PRESENT" AS "hosts_SSH_KEY_PRESENT", >> hosts."Machine_Type_Model" AS "hosts_Machine_Type_Model", >> hosts."MAC_ADDRESS_ETH_0" AS "hosts_MAC_ADDRESS_ETH_0", >> hosts."Physical_Box" AS "hosts_Physical_Box", hosts."Up_n_running" AS >> "hosts_Up_n_running", hosts."Available" AS "hosts_Available", >> hosts."Earliest_reservation_id" AS "hosts_Earliest_reservation_id", >> hosts."Project_id" AS "hosts_Project_id", architecture.id AS >> architecture_id, architecture."Architecture" AS >> "architecture_Architecture", os_kind.id AS os_kind_id, >> os_kind."OS_Kind" >> AS "os_kind_OS_Kind", os_version.id AS os_version_id, >> os_version."OS_version" AS "os_version_OS_version", >> virtualization.id AS >> virtualization_id, virtualization."Virtualization" AS >> "virtualization_Virtualization", virtualization.color AS >> virtualization_color, project.id AS project_id, project."Project" AS >> "project_Project" \nFROM hosts, architecture, os_kind, os_version, >> virtualization, project, email \nWHERE hosts."Architecture_id" = >> architecture.id AND hosts."OS_Kind_id" = os_kind.id AND >> hosts."OS_version_id" = os_version.id AND hosts."Email_id" = email.id >> AND hosts."Virtualization_id" = virtualization.id AND >> hosts."Project_id" >> = project.id AND hosts."Up_n_running" = %(Up_n_running_1)s AND >> hosts."Shareable" = %(Shareable_1)s ORDER BY Virtualization DESC, IP >> ASC' {'Shareable_1': True, 'Up_n_running_1': True} >> >> >> Note the 'ORDER BY Virtualization' clause. The Postgres docs say: >> >> 33.13.5. System Dependencies on Operator Classes >> >> "PostgreSQL uses operator classes to infer the properties of operators >> in more ways than just whether they can be used with indexes. >> Therefore, >> you might want to create operator classes even if you have no >> intention >> of indexing any columns of your data type. >> >> In particular, there are SQL features such as ORDER BY and DISTINCT >> that >> require comparison and sorting of values. To implement these >> features on >> a user-defined data type, PostgreSQL looks for the default B-tree >> operator class for the data type. The "equals" member of this operator >> class defines the system's notion of equality of values for GROUP BY >> and >> DISTINCT, and the sort ordering imposed by the operator class defines >> the default ORDER BY ordering. >> >> Comparison of arrays of user-defined types also relies on the >> semantics >> defined by the default B-tree operator class. >> >> If there is no default B-tree operator class for a data type, the >> system >> will look for a default hash operator class. But since that kind of >> operator class only provides equality, in practice it is only enough >> to >> support array equality. >> >> When there is no default operator class for a data type, you will get >> errors like "could not identify an ordering operator" if you try to >> use >> these SQL features with the data type. " >> >> ( http://www.postgresql.org/docs/7.4/static/xindex.html ) >> >> But I am not using any user-defined data class. It's just a table with >> VARCHAR for virtualization.Virtualization column, as created by SQLA: >> >> reservations=# \d virtualization >> Table "public.virtualization" >> Column | Type | >> Modifiers >> ----------------+------------------- >> +------------------------------------------------------------- >> id | integer | not null default >> nextval('virtualization_id_seq'::regclass) >> Virtualization | character varying | >> color | character varying | >> Indexes: >> "virtualization_pkey" PRIMARY KEY, btree (id) >> >> >> The SQLA query in question: >> >> selectexpr = session.query(Host, Architecture, OS_Kind, OS_version, >> Virtualization, Project) >> ... >> if direction == 'descending': >> selectexpr = selectexpr.filter_by(Up_n_running = >> True).filter_by(Shareable = True).order_by(desc(field)) >> else: >> selectexpr = selectexpr.filter_by(Up_n_running = >> True).filter_by(Shareable = True).order_by(asc(field)) >> >> ..where field happens to be 'Virtualization' by default. >> >> The above query works flawlessly with Sqlite, it's just Postgres (8.1) >> backend that has this problem. >> >> Mike! Help! :-) >> >> Regards, >> mk >> >> >> >> >> > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@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 -~----------~----~----~----~------~----~------~--~---