| @@ -473,32 +473,35 @@ class Site(object): | |||||
| """ | """ | ||||
| return self._api_query(kwargs) | return self._api_query(kwargs) | ||||
| def sql_query(self, query, params=(), plain_query=False, cursor_class=None, | |||||
| show_table=False): | |||||
| def sql_query(self, query, params=(), plain_query=False, dict_cursor=False, | |||||
| cursor_class=None, show_table=False): | |||||
| """Do an SQL query and yield its results. | """Do an SQL query and yield its results. | ||||
| For example: | |||||
| >>> query = "SELECT user_name, user_registration FROM user WHERE user_name IN (?, ?)" | |||||
| >>> for row in site.sql_query(query, ("EarwigBot", "The Earwig")): | |||||
| ... print row | |||||
| ('EarwigBot', '20090428220032') | |||||
| ('The Earwig', '20080703215134') | |||||
| <http://packages.python.org/oursql> has helpful documentation on the | |||||
| SQL module used by EarwigBot. | |||||
| If `plain_query` is True, we will force an unparameterized query. | If `plain_query` is True, we will force an unparameterized query. | ||||
| Specifying both params and plain_query will cause an error. | Specifying both params and plain_query will cause an error. | ||||
| `cursor_class` may oursql.Cursor or oursql.DictCursor. If it is not | |||||
| given, the connection default will be used, which is a regular Cursor | |||||
| unless _sql_connect() is passed a `default_cursor` kwarg. | |||||
| If `dict_cursor` is True, we will use oursql.DictCursor as our cursor, | |||||
| otherwise the default oursql.Cursor. If `cursor_class` is given, it | |||||
| will override this option. | |||||
| If `show_table` is True, the name of the table will be prepended to the | If `show_table` is True, the name of the table will be prepended to the | ||||
| name of the column. This will mainly affect a DictCursor. | name of the column. This will mainly affect a DictCursor. | ||||
| Example: | |||||
| >>> query = "SELECT user_id, user_registration FROM user WHERE user_name = ?" | |||||
| >>> params = ("The Earwig",) | |||||
| >>> result1 = site.sql_query(query, params) | |||||
| >>> result2 = site.sql_query(query, params, dict_cursor=True) | |||||
| >>> for row in result1: print row | |||||
| (7418060L, '20080703215134') | |||||
| >>> for row in result2: print row | |||||
| {'user_id': 7418060L, 'user_registration': '20080703215134'} | |||||
| See _sql_connect() for information on how a connection is acquired. | See _sql_connect() for information on how a connection is acquired. | ||||
| <http://packages.python.org/oursql> has helpful documentation on the | |||||
| oursql module. | |||||
| This may raise SQLError() or one of oursql's exceptions | This may raise SQLError() or one of oursql's exceptions | ||||
| (oursql.ProgrammingError, oursql.InterfaceError, ...) if there were | (oursql.ProgrammingError, oursql.InterfaceError, ...) if there were | ||||
| problems with the query. | problems with the query. | ||||
| @@ -506,6 +509,12 @@ class Site(object): | |||||
| if not self._sql_conn: | if not self._sql_conn: | ||||
| self._sql_connect() | self._sql_connect() | ||||
| if not cursor_class: | |||||
| if dict_cursor: | |||||
| cursor_class = oursql.DictCursor | |||||
| else: | |||||
| cursor_class = oursql.Cursor | |||||
| with self._sql_conn.cursor(cursor_class, show_table=show_table) as cur: | with self._sql_conn.cursor(cursor_class, show_table=show_table) as cur: | ||||
| cur.execute(query, params, plain_query) | cur.execute(query, params, plain_query) | ||||
| for result in cur: | for result in cur: | ||||