MySQL Connector/Python on iOS Using Pythonista 3
One of the nice things about MySQL Connector/Python is that it is available in a pure Python implementation. This makes it very portable. Today I have been exploring the possibility to take advantage of that to make MySQL Connector/Python available on my iPad.
There are few Python interpreters available for iPad. The one I will be discussing today is Pythonista 3 which has support for both Python 2.7 and 3.6. One of the things that caught my interest is that it comes with libraries to work with iOS such as accessing the contact and photos as well as UI tools. This is a commercial program (AUD 15), but this far looks to be worth the money. There are other options and I hope to write about those another day.
MySQL Connector/Python is available from PyPi. This makes it easy to install the modules in a uniform way across platforms. Unfortunately, Pythonista 3 does not support the pip
command out of the box. Instead there is a community contribution called StaSh that can be used to get a shell-like environment that can be used to execute pip
. So, our first step is to install StaSh.
Install StaSh
StaSh is a project maintained by ywangd and can be found on GitHub. It is self-installing by executing a small Python program that can be found in the README.md
file on the project repository page. You copy the source code into a new file in Pythonista 3 and execute it (using the “Play” button):
Then you need to restart Pythonista 3. At this point StaSh is installed.
Installing PyPi Package Using StaSh pip
In order to be able to use the pip command through StaSh, you need to launch the launch_stash.py
program which was installed in the previous step. The program can be found in the This iPad folder:
Open the program and use the “Play” button again to execute it. This creates the shell. You can do other things than use the pip
command, but for the purpose of installing MySQL Connector/Python that is all that is required. The command is:
[~/Documents]$ pip install mysql-connector-python
The console output is:
That’s it. Now you can use the MySQL Connector/Python modules on your iPad just as in any other environment.
Example
To verify it is working, let’s create a simple example. For this to work, you need MySQL installed allowing external access which likely requires enabling access to port 3306 in your firewall.
A simple example that queries the city table in the world database for the city with ID = 130 is:
connect_args = {
"host": "192.0.2.1",
"port": 3306,
"user": "testuser",
"password": "password",
}
db = mysql.connector.connect(**connect_args)
cursor = db.cursor(named_tuple=True)
sql = "SELECT * FROM world.city WHERE ID = 130"
cursor.execute(sql)
print(cursor.fetchone())
cursor.close()
db.close()
Edit the connect_args
dictionary with the connection arguments required for your MySQL instance.
When you run it, the details of Sydney, Australia is printed to the console:
This all looks great, but what about the X DevAPI? Unfortunately, there are some problems there.
X DevAPI
The X DevAPI is new in MySQL 8.0. It is included in MySQL Connector/Python in the mysqlx
module. However, it does not work out of the box in Pythonista 3. When you try to execute the import mysqlx
command, it fails:
>>> import mysqlx
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/private/var/mobile/Containers/Shared/AppGroup/BA51D6FF-34C8-460C-88B7-0078A16FBBD2/Pythonista3/Documents/site-packages-3/mysqlx/__init__.py", line 35, in <module>
from .connection import Session
File "/private/var/mobile/Containers/Shared/AppGroup/BA51D6FF-34C8-460C-88B7-0078A16FBBD2/Pythonista3/Documents/site-packages-3/mysqlx/connection.py", line 50, in <module>
from .crud import Schema
File "/private/var/mobile/Containers/Shared/AppGroup/BA51D6FF-34C8-460C-88B7-0078A16FBBD2/Pythonista3/Documents/site-packages-3/mysqlx/crud.py", line 34, in <module>
from .statement import (FindStatement, AddStatement, RemoveStatement,
File "/private/var/mobile/Containers/Shared/AppGroup/BA51D6FF-34C8-460C-88B7-0078A16FBBD2/Pythonista3/Documents/site-packages-3/mysqlx/statement.py", line 36, in <module>
from .expr import ExprParser
File "/private/var/mobile/Containers/Shared/AppGroup/BA51D6FF-34C8-460C-88B7-0078A16FBBD2/Pythonista3/Documents/site-packages-3/mysqlx/expr.py", line 34, in <module>
from .protobuf import Message, mysqlxpb_enum
File "/private/var/mobile/Containers/Shared/AppGroup/BA51D6FF-34C8-460C-88B7-0078A16FBBD2/Pythonista3/Documents/site-packages-3/mysqlx/protobuf/__init__.py", line 75, in <module>
from . import mysqlx_connection_pb2
File "/private/var/mobile/Containers/Shared/AppGroup/BA51D6FF-34C8-460C-88B7-0078A16FBBD2/Pythonista3/Documents/site-packages-3/mysqlx/protobuf/mysqlx_connection_pb2.py", line 8, in <module>
from google.protobuf import reflection as _reflection
File "/var/containers/Bundle/Application/743A0BDC-D77A-4479-A1D9-DFF16785FBC7/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/google/protobuf/reflection.py", line 69, in <module>
from google.protobuf.internal import python_message
File "/var/containers/Bundle/Application/743A0BDC-D77A-4479-A1D9-DFF16785FBC7/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/google/protobuf/internal/python_message.py", line 849
except struct.error, e:
^
SyntaxError: invalid syntax
So, the Protobuf module that comes with Pythonista 3 uses the old comma syntax for exception handling. This is not allowed with Python 3 (PEP 3110).
Update: While I had tried to install a newer version of Protobuf using the StaSh pip
command, what I had not realised originally is that for the change to take effect, you need to restart Pythonista 3. Once that is done, the mysqlx
module works as well. To install Protobuf in StaSh, launch StaSh in the same way as when MySQL Connector/Python was installed above and execute the pip
command:
[~/Documents]$ pip install protobuf
0 Comments on “MySQL Connector/Python on iOS Using Pythonista 3”