diff -r 6462b9039a50 lib/sqlalchemy/dialects/postgresql/base.py
--- a/lib/sqlalchemy/dialects/postgresql/base.py	Fri Jun 08 14:43:52 2012 -0400
+++ b/lib/sqlalchemy/dialects/postgresql/base.py	Sat Jun 09 23:45:44 2012 -0400
@@ -637,6 +637,16 @@
             text += " OFFSET " + self.process(sql.literal(select._offset))
         return text
 
+    def format_from_hint_text(self, sqltext, table, hint):
+        if hint.upper() != 'ONLY':
+            raise CompileError("Unrecognized hint: %r" % hint)
+        return "ONLY " + sqltext
+
+    def format_crud_hint_text(self, sqltext, table, hint):
+        if hint.upper() != 'ONLY':
+            raise CompileError("Unrecognized hint: %r" % hint)
+        return "ONLY " + sqltext
+
     def get_select_precolumns(self, select):
         if select._distinct is not False:
             if select._distinct is True:
diff -r 6462b9039a50 lib/sqlalchemy/sql/compiler.py
--- a/lib/sqlalchemy/sql/compiler.py	Fri Jun 08 14:43:52 2012 -0400
+++ b/lib/sqlalchemy/sql/compiler.py	Sat Jun 09 23:45:44 2012 -0400
@@ -820,9 +820,7 @@
                     self.preparer.format_alias(alias, alias_name)
 
             if fromhints and alias in fromhints:
-                hinttext = self.get_from_hint_text(alias, fromhints[alias])
-                if hinttext:
-                    ret += " " + hinttext
+                ret = self.format_from_hint_text(ret, alias, fromhints[alias])
 
             return ret
         else:
@@ -859,6 +857,18 @@
         else:
             return column
 
+    def format_from_hint_text(self, sqltext, table, hint):
+        hinttext = self.get_from_hint_text(table, hint)
+        if hinttext:
+            sqltext += " " + hinttext
+        return sqltext
+
+    def format_crud_hint_text(self, sqltext, table, hint):
+        return sqltext + " " + self.get_crud_hint_text(
+                                    table, 
+                                    hint
+                                )
+
     def get_select_hint_text(self, byfroms):
         return None
 
@@ -1029,9 +1039,7 @@
             else:
                 ret = self.preparer.quote(table.name, table.quote)
             if fromhints and table in fromhints:
-                hinttext = self.get_from_hint_text(table, fromhints[table])
-                if hinttext:
-                    ret += " " + hinttext
+                ret = self.format_from_hint_text(ret, table, fromhints[table])
             return ret
         else:
             return ""
@@ -1423,7 +1431,8 @@
         self.stack.append({'from': set([delete_stmt.table])})
         self.isdelete = True
 
-        text = "DELETE FROM " + self.preparer.format_table(delete_stmt.table)
+        text = "DELETE FROM "
+        table_text = self.preparer.format_table(delete_stmt.table)
 
         if delete_stmt._hints:
             dialect_hints = dict([
@@ -1433,13 +1442,17 @@
                 if dialect in ('*', self.dialect.name)
             ])
             if delete_stmt.table in dialect_hints:
-                text += " " + self.get_crud_hint_text(
-                                    delete_stmt.table, 
+                table_text = self.format_crud_hint_text(
+                                    table_text,
+                                    delete_stmt.table,
                                     dialect_hints[delete_stmt.table]
                                 )
+
         else:
             dialect_hints = None
 
+        text += table_text
+
         if delete_stmt._returning:
             self.returning = delete_stmt._returning
             if self.returning_precedes_values:
