pythonpython-3.xpython-2.7error-handlingpymysql

No module found named cursors


I just installed PyMySQL on my VPS, which did not seem to have any problems installing.

To make sure everything was working fine, I tried executing the following script that I found in their documentation.

Python 2.7.5 and Python 3.6.5

Server version: 10.1.34-MariaDB MariaDB Server

import pymysql.cursors

# Connect to datebase
con = pymysql.connect(host='localhost',
                    user='dbuser',
                    password='dbpass',
                    db='dbname',
                    charset='utf8mb4',
                    cursorclass=pymysql.cursor.DictCursor)

try:
    with con.cursor() as cursor:
        # Create new record
        sql = "INSERT INTO `test` (`idx`, `title`, `description`, `category`) VALUES (%s, %s, %s, %s)"
        cursor.execute(sql, (1, 'Fake Title', 'Fake description about a fake post.', 'WELLNESS'))

    with con.cursor() as cursor:
        # Read a single record
        sql = "SELECT `idx`, `title` FROM `test` WHERE `idx`=%s"
        cursor.execute(sql, ('1'))
        result = cursor.fetchone()
finally:
    with open('dbText.txt', 'w') as f:
        f.write('%s'.format(result))
        con.close()

However, I am receiving an ImportError that reads No module found named cursors.

[root@host public_html]# python pymysql.py

Traceback (most recent call last):
    File "pymysql.py", line 1, in <module>
        import pymysql.cursors
    File "/home/bldsprt/public_html/pymysql.py", line 1, in <module>
        import pymysql.cursors
ImportError: No module named cursors

[root@host public_html]# python3.6 pymysql.py
Traceback (most recent call last):
  File "pymysql.py", line 1, in <module>
    import pymysql.cursors
  File "/home/bldsprt/public_html/pymysql.py", line 1, in <module>
    import pymysql.cursors
ModuleNotFoundError: No module named 'pymysql.cursors'; 'pymysql' is not a package

When I try to reinstall, it indicates that pymysql is already installed.

[root@host public_html]# pip install pymysql
Requirement already satisfied: pymysql in /usr/local/lib/python3.6/site-packages (0.9.0)
Requirement already satisfied: cryptography in /usr/local/lib/python3.6/site-packages (from pymysql) (2.2.2)
Requirement already satisfied: idna>=2.1 in /usr/local/lib/python3.6/site-packages (from cryptography->pymysql) (2.7)
Requirement already satisfied: six>=1.4.1 in /usr/local/lib/python3.6/site-packages (from cryptography->pymysql) (1.11.0)
Requirement already satisfied: cffi>=1.7; platform_python_implementation != "PyPy" in /usr/local/lib/python3.6/site-packages (from cryptography->pymysql) (1.11.5)
Requirement already satisfied: asn1crypto>=0.21.0 in /usr/local/lib/python3.6/site-packages (from cryptography->pymysql) (0.24.0)
Requirement already satisfied: pycparser in /usr/local/lib/python3.6/site-packages (from cffi>=1.7; platform_python_implementation != "PyPy"->cryptography->pymysql) (2.18)

Do I need to install the cursors module separately?

Any help would be huge!


Solution

  • This part of the stacktrace reveals the issue:

        File "/home/bldsprt/public_html/pymysql.py", line 1, in <module>
              import pymysql.cursors
    ImportError: No module named cursors
    

    You've named the file you're using to test "pymysql.py" -- so, Python tries to grab the cursors module from the selfsame file. If you rename the file to something else, it should be able to load the correct library file, as long as pymysql is installed via pip2/pip2.7 (seems pip on your system defaults to the Python 3 installation).

    Additionally, from looking at the the package and documentation itself, I think that when you initialize the MySQL connection object (con), it should use pymysql.cursors.DictCursor (cursors, not cursor) for the cursorclass.