12

Currently:

  • SQLAlchemy installed and working (or at least import v0.8.0b2)
  • Mysql (v5.5.16)
  • Distribute (0.6.34)
  • Oracle mysql-python connector
  • Python 3.2
  • Windows 7 32/64 (note that I installed Python 32bits)

The problem is that MySQLdb or Oursql is required and I didn't managed to get any of them working.

Found this but didn't manage to get it working neither.

Edit: If you are aware of an other orm that works with Python3, I'm interested.

3
  • MySQL-python doesn't seem to support Python 3 for now, but Oursql seems to support Pyton 3, and I guess you can get PyMySQL to work on Python 3.x too. Commented Jan 5, 2013 at 13:25
  • Thanks for your answer. Indeed i saw that oursql should support Python 3 but the installation failed. It told that i'm not using cython. Tried pymysql but don't remember the error. Commented Jan 5, 2013 at 14:57
  • docs.sqlalchemy.org/en/20/dialects/mysql.html#dialect-mysql Commented Nov 3, 2024 at 17:42

5 Answers 5

33

I was successful in getting Oracle's MySQL connector for python working with SQLAlchemy on Python 3.3. Your connection string needs to start with "mysql+mysqlconnector://...". After I changed my connection string everything (well, simple things) started working.

The MySQL connector docs can be found here: https://dev.mysql.com/doc/connector-python/en/

The package is up on PyPi: https://pypi.org/project/mysql-connector-python/

Here are the SQLAlchemy docs about using the Python connector: http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#module-sqlalchemy.dialects.mysql.mysqlconnector

Sign up to request clarification or add additional context in comments.

2 Comments

I'll test this but at the time of the question it didn't worked. Maybe they finally made an update. There wasn't any sqlalchemy for 3.3.
2024 info: Sqlalchemt states the following The MySQL Connector/Python DBAPI has had many issues since its release, some of which may remain unresolved, and the mysqlconnector dialect is not tested as part of SQLAlchemy’s continuous integration. The recommended MySQL dialects are mysqlclient and PyMySQL. writing this for anyone that may need to change his mind docs.sqlalchemy.org/en/20/dialects/…
13

For others who arrive here, this should do it:

  • pip install mysql-connector==2.1.4 # version avoids Protobuf error
  • URI = 'mysql+mysqlconnector://$USER:$PASS@$HOST/$DB'

Comments

2

I tried Oracle's connection, as suggested by @Brad Campbell, but unfortunately it was extremely slow, much slower than the "real" MySQL-Python connection I had been using with SQLAlchemy on Python 2.

After checking SQLAlchemy themselves,

http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#module-sqlalchemy.dialects.mysql.mysqldb

To use MySQL-Python on Python 3, they recommend a fork of it, mysqlclient,

https://github.com/PyMySQL/mysqlclient-python

It is available via pip with pip install mysqlclient, but there are almost certainly other steps you'll need to do to set it up initially. After that though, I was seeing the performance go back to what I was used to, which was about 5x faster than with Oracle's connector.

Comments

1

I've gotten oursql + SQLAlchemy 0.8.1 + Python 3.3 to work. Building off of LukeCarrier's port, I modified oursql.c to use the correct import levels, and it worked! Try this, and be sure to follow the readme:

https://github.com/clintron/py3k-oursql

You may also need to have the latest version of Cython.

3 Comments

Yes, this works for me, too (using Python 3.2, though). However, I get DBAPIError exceptions when strings contain non-ASCII characters. Is this supposed to be working?
It should work. I just successfully inserted a Chinese character (北) through this connector. Is your database using UTF-8 or latin1?
It's using UTF-8, and I tried Unicode(100), String(100) and String(100, convert_unicode = True). But anyway.. I'll continue to experiment. Good to know that it's supposed to be working. Thank you.
0

Here is a modern solution for the pymysql driver using the do connect event

DBHostname = DBCLUSTER_HOSTNAME
DBPort = DBCLUSTER_PORT
DBUsername = DBCLUSTER_USER
DBName = DBCLUSTER_NAME

engine = sqlalchemy.create_engine(
    "mysql+pymysql:///"
)  # connection params will be set by the event callback

@sqlalchemy.event.listens_for(engine, "do_connect")
def provide_token(dialect, conn_rec, cargs, cparams):

    # set up db connection parameters, alternatively we can get these from boto3 describe_db_instances
    cparams["host"] = DBHostname
    cparams["port"] = int(DBPort)
    cparams["user"] = DBUsername
    cparams["password"] = password
    cparams["database"] = DBName

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.