Querying a MariaDB or MySQL database using Python

On a CentOS Linux system, I have a MariaDB (MariaDB is a fork of MySQL) database named "Books" that contains a table named "Amazon" where I've stored information on books that includes their Amazon Standard Identification Number (ASIN). I want to be able to run a Python script to which I provide a word as a command line argument and have the script find all books in that database table that have a title containing that word and to print the title, which is stored in a column named "Description" along with the ASIN, which is stored in a column named "ASIN". To do so, I use a script with the following code:

#!/usr/bin/python

import mysql.connector, sys

def executeSQL(conn, queryTerm):
    cursor = conn.cursor()
    query = "select ASIN, Description from Amazon where Description like " + queryTerm
    cursor.execute(query)
    result = cursor.fetchall()    
    for row in result:
       print row[0], row[1]

hostname = 'localhost'
username = 'myAcctName'
password = 'ThePassword'
database = 'Books'

try:
   sys.argv[1]
except IndexError:
   print "Error - missing query word! Usage ./findBook queryWord"
   sys.exit(1)
else:
   queryWord = "'%" + sys.argv[1] + "%'" 

connection = mysql.connector.connect( host=hostname, user=username, passwd=password, db=database )
executeSQL(connection,queryWord)
connection.close()

I import two Python modules, mysql.connector and sys. I import the sys module just so I can check for whether the query word has been provided as an argument to the script. If I forgot it, the script will print a usage message that indicates a word to search on must be provided at the command line and then exit. I use the mysql.connector module to connect to the database. To imort that module, the mysql-connector-python package is needed; you can check if it is installed on a CentOS system with rpm -qi mysql-connector-python.

Mastering Python
Mastering Python
1x1 px



Python by Example
Python by Example
1x1 px

$ rpm -qi mysql-connector-python
Name        : mysql-connector-python
Version     : 1.1.6
Release     : 1.el7
Architecture: noarch
Install Date: Sun 01 Nov 2015 03:44:59 PM EST
Group       : Development/Languages
Size        : 651017
License     : GPLv2 with exceptions
Signature   : RSA/SHA256, Sat 26 Apr 2014 01:30:37 PM EDT, Key ID 6a2faea2352c64e5
Source RPM  : mysql-connector-python-1.1.6-1.el7.src.rpm
Build Date  : Wed 16 Apr 2014 12:04:42 PM EDT
Build Host  : buildvm-17.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : http://dev.mysql.com/doc/connector-python/en/index.html
Summary     : MySQL Connector for Python 2
Description :
MySQL Connector/Python is implementing the MySQL Client/Server protocol
completely in Python. No MySQL libraries are needed, and no compilation
is necessary to run this Python DB API v2.0 compliant driver.

Documentation: http://dev.mysql.com/doc/connector-python/en/index.html
$

If it isn't installed, you can install it on a CentOS system by running yum install mysql-connector-python at a command prompt.

To connect to the database, I need to specify the hostname - in this case I'm running the command on the same system that the database resides on, so I use localhost. I need to specify the database name and a MariaDB/MySQL user name with access to that database and the password associated with that username, which I do with the lines below:

hostname = 'localhost'
username = 'myAcctName'
password = 'ThePassword'
database = 'Books'

Note: if you receive an error message regarding an insecure password, see Authentication with old (insecure) passwords is not supported for a means to resolve that problem.

With those variables, set I can then establish a connection to the database with the line below:

connection = mysql.connector.connect( host=hostname, user=username, passwd=password, db=database )

I chose to put the execution of the Structured Query Language (SQL) code that queries the table in a function named "executeSQL", which I call with the word supplied on the command line; that word is enclosed within percent signs and single quotes since I want to find any instance of the word in a book's description. One can use LIKE '%word%' to indicate that it doesn't matter what characters appear or after the specified word, i.e., the percent signs represent wildcard characters. So, if I specified Perl on the command line, the SQL code that is executed by the SQL statement "select ASIN, Description from Amazon where Description like " + queryTerm is select ASIN, Description from Amazon where Description like '%Perl%', which will find a description that beings with the word "Perl", one that has "Perl" in the middle of the description, or one that ends with the word "Perl" - Perl in this case is the computer language of that name.

The Python command cursor.execute(query) executes the SQL command stored in the variable query. The variable named result will hold all of the rows from the table that have a description containing the word on which I'm querying the database. Since I want to print the information from each row from result with the ASIN, i.e., row[0], first on the line followed by the description, i.e., row[1], I use the code below:

    result = cursor.fetchall()
    for row in result:
       print row[0], row[1]

When I run the script, I see output like the following:

$ ./findBook.py Perl
0596004923 Programming Perl: Unmatched power for text processing and scripting 4th Edition
1565924193 CGI Programming with Perl Second Edition
$

Related articles:

  1. Counting SQLite records based on a specified date
  2. Using Python to query an SQLite database and return a count of records
  3. Importing data from a text file into an SQLite database with Python

References:

  1. Chapter 5 Connector Python Coding Examples
    MySQL Documentation
  2. 5.4 Querying Data Using Connector/Python
    MySQL Documentation