jenkins-bot has submitted this change and it was merged. Change subject: Run a mysql query and yield results by row ......................................................................
Run a mysql query and yield results by row Allow execution of a mysql query and yield result row by row. Change pagegenerators.MySQLPageGenerator to use this function. Change-Id: I723ab533cabc0f59e5a0d7752c513b9ddb1f343c --- A pywikibot/data/mysql.py M pywikibot/pagegenerators.py 2 files changed, 91 insertions(+), 31 deletions(-) Approvals: John Vandenberg: Looks good to me, approved jenkins-bot: Verified diff --git a/pywikibot/data/mysql.py b/pywikibot/data/mysql.py new file mode 100644 index 0000000..afe5993 --- /dev/null +++ b/pywikibot/data/mysql.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +"""Miscellaneous helper functions for mysql queries.""" +# +# (C) Pywikibot team, 2016 +# +# Distributed under the terms of the MIT license. +# +from __future__ import absolute_import, print_function, unicode_literals +__version__ = '$Id$' + +# Requires oursql <https://pythonhosted.org/oursql/> or +# MySQLdb <https://sourceforge.net/projects/mysql-python/> +try: + import oursql as mysqldb +except ImportError: + import MySQLdb as mysqldb + +import pywikibot + +from pywikibot import config2 as config + + +def mysql_query(query, params=(), dbname=None, encoding='utf-8', verbose=None): + """ + Yield rows from a MySQL query. + + An example query that yields all ns0 pages might look like:: + + SELECT + page_namespace, + page_title, + FROM page + WHERE page_namespace = 0; + + @param query: MySQL query to execute + @type query: str + @param params: input parametes for the query, if needed + @type params: tuple + @param dbname: db name + @type dbname: str + @param encoding: encoding used by the database + @type encoding: str + @param verbose: if True, print query to be executed; + if None, config.verbose_output will be used. + @type verbose: None or bool + @return: generator which yield tuples + """ + if verbose is None: + verbose = config.verbose_output + + if config.db_connect_file is None: + conn = mysqldb.connect(config.db_hostname, + db=config.db_name_format.format(dbname), + user=config.db_username, + passwd=config.db_password, + port=config.db_port) + else: + conn = mysqldb.connect(config.db_hostname, + db=config.db_name_format.format(dbname), + read_default_file=config.db_connect_file, + port=config.db_port) + + cursor = conn.cursor() + if verbose: + pywikibot.output('Executing query:\n%s' % query) + query = query.encode(encoding) + params = tuple(p.encode(encoding) for p in params) + + if params: + cursor.execute(query, params) + else: + cursor.execute(query) + + for row in cursor: + yield row + + cursor.close() + conn.close() diff --git a/pywikibot/pagegenerators.py b/pywikibot/pagegenerators.py index 8981b9d..0e0b1f3 100644 --- a/pywikibot/pagegenerators.py +++ b/pywikibot/pagegenerators.py @@ -2424,7 +2424,7 @@ yield page -def MySQLPageGenerator(query, site=None): +def MySQLPageGenerator(query, site=None, verbose=None): """ Yield a list of pages based on a MySQL query. @@ -2437,43 +2437,25 @@ FROM page WHERE page_namespace = 0; - Requires oursql <https://pythonhosted.org/oursql/> or - MySQLdb <https://sourceforge.net/projects/mysql-python/> - @param query: MySQL query to execute @param site: Site object @type site: L{pywikibot.site.BaseSite} - @return: iterator of pywikibot.Page + @param verbose: if True, print query to be executed; + if None, config.verbose_output will be used. + @type verbose: None or bool + @return: generator which yield pywikibot.Page """ - try: - import oursql as mysqldb - except ImportError: - import MySQLdb as mysqldb + from pywikibot.data import mysql + if site is None: site = pywikibot.Site() - if config.db_connect_file is None: - conn = mysqldb.connect(config.db_hostname, - db=config.db_name_format.format(site.dbName()), - user=config.db_username, - passwd=config.db_password, - port=config.db_port) - else: - conn = mysqldb.connect(config.db_hostname, - db=config.db_name_format.format(site.dbName()), - read_default_file=config.db_connect_file, - port=config.db_port) - - cursor = conn.cursor() - pywikibot.output(u'Executing query:\n%s' % query) - query = query.encode(site.encoding()) - cursor.execute(query) - while True: - try: - namespaceNumber, pageName = cursor.fetchone() - except TypeError: - # Limit reached or no more results - break + row_gen = mysql.mysql_query(query, + dbname=site.dbName(), + encoding=site.encoding(), + verbose=verbose) + for row in row_gen: + namespaceNumber, pageName = row if pageName: # Namespace Dict only supports int namespace = site.namespace(int(namespaceNumber)) -- To view, visit https://gerrit.wikimedia.org/r/275300 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I723ab533cabc0f59e5a0d7752c513b9ddb1f343c Gerrit-PatchSet: 6 Gerrit-Project: pywikibot/core Gerrit-Branch: master Gerrit-Owner: Mpaa <[email protected]> Gerrit-Reviewer: Eranroz <[email protected]> Gerrit-Reviewer: John Vandenberg <[email protected]> Gerrit-Reviewer: Ladsgroup <[email protected]> Gerrit-Reviewer: Mpaa <[email protected]> Gerrit-Reviewer: Xqt <[email protected]> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
