On our programming courses we often use SQLite as our database - it installs locally, saves us the need for daemons, saves licensing and password issues, and lets us cover the interfacing very quickly and easily. There's a Python example
[here].
However, there are some occasions when a customer may specify a particular database they wish to use, or may ask us to talk to a daemon based engine, and for these purposes for Python I've added a MySQL server, and the connector class, on one of my training machines (Kingston) today.
Firstly (and outside this note) install and get MySQL running and set up an appropriate account and password. Check that it works using the local MySQL client - there's a copy of what you should do and see
[here].
Then grab the Python connector - current version at https://pypi.python.org/pypi/mysql-connector-python/2.0.3 , but that will vary with release number over time. Install it by running (as root):
python setup.py install
You can then run test programs - I have three which I've adapted from the open source examples supplies with the drivers - the first one does the basic CRUD stuff - Create, Read, Update, Delete - see
[here]. The second uses results within results - see
[here], and the third and final example in this series -
[here] - uses prepared statements which just need to be filled in within a formatting loop.
A tiny Python program / very simple class can often sit on top of a huge database ... while writing this note, I downloaded a backup of our database which is 3 Gytes of compressed data (we have two huge image libraries with 10,000 images each in there) - yet I can access that data quickly, simply and easily from Python.
Try out what you want with the MySQL client (or a tool) first:
mysql> select id_topic,subject from smf_messages group by id_topic order by id_topic desc limit 20;
+----------+--------------------------------------------------------------------------+
| id_topic | subject |
+----------+--------------------------------------------------------------------------+
| 15416 | Suggestion - extra early evening peak train |
| 15415 | Re: An extra service to Frome from May 2015. Potential for another??? |
| 15414 | Rules of the Road |
| 15413 | Re: Electric spurs? |
| 15412 | Re: Landslide Exeter St Davids and Tiverton Parkway 20 Feb 2015 |
| 15411 | Re: 'Dozens Hurt' In Swiss Train Collision |
| 15410 | Re: Flooding affects route between Looe and Liskeard |
| 15409 | Be careful who you swear at on the train |
| 15408 | Cotswold Airport could be shut for housing |
| 15407 | Re: Great Train Robbery memorabilia sold at auction |
| 15406 | Re: London rail delays spark tweet complaints |
| 15405 | Community Rail Conference - notes to check |
| 15404 | Re: Political party transport policies heading into the general election |
| 15403 | Re: Timetables from May 2015 |
| 15402 | Timetables from May 2015 |
| 15401 | Timetable amendments from 17th May 2015 |
| 15400 | Re: Up platform at Oxford blocked |
| 15399 | Re: Reversal at Bath Spa |
| 15398 | Re: Landslip between Fishguard and Goodwick and Clarbeston Road |
| 15397 | Re: Why has Lanfairpwll been rebranded Healthy-lung Village? |
+----------+--------------------------------------------------------------------------+
20 rows in set (0.00 sec)
mysql>
Then put it in code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#%% Simple selector (MySQL database of 168,000 records)
# Simple selector (MySQL database of 168,000 records)
import mysql.connector
def main(config):
output = []
cnx = mysql.connector.connect(**config)
cur = cnx.cursor()
stmt_select = "select id_topic,subject from smf_messages group by id_topic order by id_topic desc limit 20"
cur.execute(stmt_select)
for row in cur.fetchall():
output.append("{0:6d} - {1:s}".format(row[0], row[1]))
cur.close()
cnx.close()
return output
if __name__ == '__main__':
config = {
'host': 'localhost',
'port': 3306,
'database': 'fgw',
'user': 'root',
'password': 'k645pfb',
'charset': 'utf8',
'use_unicode': True,
'get_warnings': True,
}
out = main(config)
print('\n'.join(out))
Complete source code at
[here]
And see how that works:
trainee@kingston:~/py_sql$ python inserts.py
15416 - Suggestion - extra early evening peak train
15415 - Re: An extra service to Frome from May 2015. Potential for another???
15414 - Rules of the Road
15413 - Re: Electric spurs?
15412 - Re: Landslide Exeter St Davids and Tiverton Parkway 20 Feb 2015
15411 - Re: 'Dozens Hurt' In Swiss Train Collision
15410 - Re: Flooding affects route between Looe and Liskeard
15409 - Be careful who you swear at on the train
15408 - Cotswold Airport could be shut for housing
15407 - Re: Great Train Robbery memorabilia sold at auction
15406 - Re: London rail delays spark tweet complaints
15405 - Community Rail Conference - notes to check
15404 - Re: Political party transport policies heading into the general election
15403 - Re: Timetables from May 2015
15402 - Timetables from May 2015
15401 - Timetable amendments from 17th May 2015
15400 - Re: Up platform at Oxford blocked
15399 - Re: Reversal at Bath Spa
15398 - Re: Landslip between Fishguard and Goodwick and Clarbeston Road
15397 - Re: Why has Lanfairpwll been rebranded Healthy-lung Village?
trainee@kingston:~/py_sql$
(written 2015-02-21)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
S156 - Interfacing Applications to MySQL Databases [104] mysql_connect or mysql_pconnect in PHP? - (2004-10-30)
[644] Using a MySQL database from Perl - (2006-03-13)
[663] Python to MySQL - (2006-03-31)
[723] Viewing images held in a MySQL database via PHP - (2006-05-17)
[1381] Using a MySQL database to control mod_rewrite via PHP - (2007-10-06)
[1450] Easy selection of multiple SQL conditions from PHP - (2007-11-30)
[1518] Downloading data for use in Excel (from PHP / MySQL) - (2008-01-25)
[1561] Uploading to a MySQL database through PHP - examples and common questions - (2008-03-02)
[1885] Hiding a MySQL database behind a web page - (2008-11-15)
[2263] Mysqldump fails as a cron job - a work around - (2009-06-30)
[2381] Checking the database connection manually - (2009-08-28)
[2745] Connecting Python to sqlite and MySQL databases - (2010-04-28)
[2790] Joining a MySQL table from within a Python program - (2010-06-02)
[3035] How to display information from a database within a web page - (2010-11-07)
[3099] Perl - database access - DBD, DBI and DBIx modules - (2010-12-22)
[3447] Needle in a haystack - finding the web server overload - (2011-09-18)
[3455] MySQL, MySQLi, PDO or something else - how best to talk to databases from PHP - (2011-09-24)
Y113 - Python and SQL databases [2746] Model - View - Controller demo, Sqlite - Python 3 - Qt4 - (2010-04-29)
[2786] Factory methods and SqLite in use in a Python teaching example - (2010-05-29)
[3136] A framework with python - Django - first steps - (2011-01-17)
[3139] Steering our Python courses towards wxPython, SQLite and Django - (2011-01-19)
[4024] SQL databases from Python - an SQLite example - (2013-03-02)
[4086] Cacheing class for Python - using a local SQLite database as a key/value store - (2013-05-14)
[4445] Graphing presentations in Python - huge data, numpy and matplotlib - (2015-02-28)
[4535] SQLAlchemy - first examples with a Python Object Relationship Mapping system - (2015-10-14)
[4537] example of SQLite using a local database file through SQLalchemy - (2015-10-14)
Some other Articles
A first graph with Matplotlib in PythonJson is the new marshall, pickle and cPickle / PythonLoving programming in Python - and ready to teach YOU howAdding a PHP build option, rotating an image based on camera data, and a new look at thumbnails in PHPAccessing a MySQL database from Python with mysql.connectorImages of our rail promotion campaign Public training courses - upcoming datesDifferent views of a Welsh Valley - but headed homeJava web application for teaching - now with sessions and clustering / load balancing demonstrationsA Java servlet that is also a stand alone program. And a server that is also a web client.