I used mysql_config_editor
to create a .mylogin.cnf
file with a password. I know it worked correctly because I can use it to connect through both the command line utility mysql
and the R package RMySQL
without a problem.
However, when trying to connect using Mysql-Connector/Python:
# using mysql-connector-python-rf
import os
import mysql.connector
con = mysql.connector.connect(option_files=os.path.expanduser('~/.mylogin.cnf'))
or with PyMySQL:
# using pymysql
import os
import pymysql
con = pymysql.connect(option_files=os.path.expanduser('~/.mylogin.cnf'))
I get the same error:
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-64-d17e56ef7010> in <module>()
----> 1 con = mysql.connector.connect(option_files=os.path.expanduser('~/.mylogin.cnf'))
/usr/local/lib/python3.5/site-packages/mysql/connector/__init__.py in connect(*args, **kwargs)
140 # Option files
141 if 'option_files' in kwargs:
--> 142 new_config = read_option_files(**kwargs)
143 return connect(**new_config)
144
/usr/local/lib/python3.5/site-packages/mysql/connector/optionfiles.py in read_option_files(**config)
66 config['option_files'] = [config['option_files']]
67 option_parser = MySQLOptionsParser(list(config['option_files']),
---> 68 keep_dashes=False)
69 del config['option_files']
70
/usr/local/lib/python3.5/site-packages/mysql/connector/optionfiles.py in __init__(self, files, keep_dashes)
162 self.files = files
163
--> 164 self._parse_options(list(self.files))
165 self._sections = self.get_groups_as_dict()
166
/usr/local/lib/python3.5/site-packages/mysql/connector/optionfiles.py in _parse_options(self, files)
193 "than once in the list".format(file_))
194 with open(file_, 'r') as op_file:
--> 195 for line in op_file.readlines():
196 if line.startswith('!includedir'):
197 _, dir_path = line.split(None, 1)
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/ascii.py in decode(self, input, final)
24 class IncrementalDecoder(codecs.IncrementalDecoder):
25 def decode(self, input, final=False):
---> 26 return codecs.ascii_decode(input, self.errors)[0]
27
28 class StreamWriter(Codec,codecs.StreamWriter):
UnicodeDecodeError: 'ascii' codec can't decode byte 0x96 in position 28: ordinal not in range(128)
Skimming over the source code, it looks like these are trying to read the files in cleartext. However, mysql_config_editor
encrypts the login file it generates. Both modules work fine when entering the password manually in the code.
How can I connect to Python using one of these generated config files? I'm using Python 3, so MySQLdb isn't an option.
update: for now, I'm using RPy2 to run queries in R and pipe the results back into Python. The code is a little ugly but the workflow isn't so bad.
PyMySQL and mysql-connector are both open source tools. PyMySQL with 6.45K GitHub stars and 1.29K forks on GitHub appears to be more popular than mysql-connector with 37 GitHub stars and 8 GitHub forks.
Python needs a MySQL driver to access the MySQL database. In this tutorial we will use the driver "MySQL Connector". We recommend that you use PIP to install "MySQL Connector".
pip install myloginpath
worked for me, then:
import myloginpath
import pymysql
conf = myloginpath.parse('client')
db = pymysql.connect(**conf, host='mydbhost', db='whatever')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With