Like PHP also Python has its own MySQL connector library (see here). However other connectors exist. Here we choose to use MySQLdb (documentation – see also the DB API specification PEP-249). This is fine for Python 3. You can install it via pip: pip install MySQL-python
.
Otherwise, to install on Linux (assuming Debian/Ubuntu):
sudo apt-get install build-essential python-dev libmysqlclient-dev
or on Mac OS via port:
sudo port install py-mysql
Tutorial
MySQL Python tutorial
A simple demo program. We assume you have the BSC, ucac2_initial and ascc25 tables are present in the mpe2018db database (see reference page):
#!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb as mdb con = mdb.connect('localhost', 'mpeusr', 'mpe2018pass', 'mpe2018db') with con: cur = con.cursor(mdb.cursors.DictCursor) cur.execute("SELECT * FROM BSC LIMIT 4") rows = cur.fetchall() for row in rows: print (row["Name"], row["RA"], row["DE"], row["Vmag"])
The demo programs provided show some simple examples using this connector to perform queries also via SID / DIF facilities on the mpe2018db database tables:
shell> cd Soft/Python ls dif_mypydemo1.py mcs_mypydemo1.py mypydemo1.py mypydemo2.py sid_mypydemo1.py
If you want to run the file directly, check they are executable and if not use a chmod +x mypydemo1.py. Otherwise simply run python mypydemo1.py. Also note that for Python 2 you need to change the print statements.
So, assuming you had installed SID (but not DIF / MCS):
./mypydemo1.py ./mypydemo2.py ./sid_mypydemo1.py ./sid_mypydemo2.py
Have a look to the programs source code. A simple (not-parameterised) use case below:
import MySQLdb # connect to the DB db = MySQLdb.connect(host="127.0.0.1", user="mpeusr", passwd="mpe2018pass", db="mpe2018db") # a Cursor object: it will let you execute all the queries you need cur = db.cursor() # execute a query to get the column names cur.execute("describe ucac2_initial") print ([column[0] for column in cur.fetchall()]) # columns description print ("\n# ", cur.description) # another query: use all the SQL you like qry = "SELECT * FROM ucac2_initial limit 20" # execute the query cur.execute(qry) # get the number of rows in the result set numrows = int(cur.rowcount) print ("Returned number of rows: ", numrows) # get and display one row at a time for x in range(0, numrows): print (cur.fetchone()) db.close()
And here is a query using the SID procedures:
import MySQLdb # connect to the DB db = MySQLdb.connect(host="127.0.0.1", user="mpeusr", passwd="mpe2018pass", db="mpe2018db") # a Cursor object: it will let you execute all the queries you need cur = db.cursor() qry = "CALL SID.SelectCircleHTM('', 'RAmas/3.6e6 as ra, DECmas/3.6e6 as `Dec`, Vmm/1e3 as V', 'mpe2018db.ascc25', 'htm6', 6, 'RAmas/3.6e6', 'DECmas/3.6e6', 30, -20, 30, 'WHERE Vmm<12000')" cur.execute(qry) # first returned string is the call to the procedure that creates the temporary region IDs table SID.sid row = cur.fetchone() print (row[0]) # the second string reports the actual join query to select objects in the region cur.nextset() row = cur.fetchone() print (row[0]) # now we move to the returned data set (empty if an output table was given) cur.nextset() # get the number of rows in the resultset numrows = int(cur.rowcount) print ("\nReturned number of rows: ", numrows) # get the number of fields and their names num_fields = len(cur.description) field_names = [f[0] for f in cur.description] print ("Field names:\n", field_names, "\n") # get and display one row at a time for i in range(0, numrows): row = cur.fetchone() v = [row[j] for j in range(0, num_fields)] print (v) cur.close() db.close()
See the demo programs source code for more details.