web-dev-qa-db-fra.com

Passer de SQLite à MySQL avec Flask SQLAlchemy

J'ai un site que j'ai construit avec Flask SQLAlchemy et SQLite, et j'ai besoin de passer à MySQL. J'ai migré la base de données elle-même et l'ai exécutée sous MySQL, mais

  1. Impossible de comprendre comment se connecter à la base de données MySQL (c'est-à-dire ce que le SQLALCHEMY_DATABASE_URI devrait l'être) et
  2. Je ne sais pas si l'un de mes codes SQLAlchemy SQLite existants fonctionnera avec MySQL.

Je soupçonne que (1) est assez simple et il suffit de montrer comment mapper, par exemple, le contenu de la boîte de dialogue de connexion que j'utilise dans mon outil de base de données MySQL vers une URL correctement formatée. Mais je suis inquiet pour (2), j'avais supposé que SQLAlchemy fournissait une couche d'abstraction pour que code SQLAlchemy simple tel que

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

admin = User('admin', '[email protected]')

db.session.add(admin)

User.query.all()

User.query.filter_by(username='admin').first()

wold fonctionne sans aucune modification autre qu'une modification appropriée de l'URI de la base de données; mais les exemples que j'ai trouvés pour utiliser SQLAlchemy avec MySQL semblent utiliser une API complètement différente.

Puis-je (2) migrer mon code Flask SQLAlchemy pour travailler avec une base de données MySQL en changeant simplement l'URI de la base de données et si oui (1) quel devrait être cet URI?

33
orome

Le tutoriel pointé par vous montre la bonne façon de se connecter à MySQL à l'aide de SQLAlchemy. Voici votre code avec très peu de changements:

Mes hypothèses sont que votre serveur MySQL fonctionne sur la même machine où Flask est en cours d'exécution et le nom de la base de données est db_name. Dans le cas où votre serveur n'est pas la même machine, mettez l'adresse IP du serveur à la place de localhost.

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

admin = User('admin', '[email protected]')

db.create_all() # In case user table doesn't exists already. Else remove it.    

db.session.add(admin)

db.session.commit() # This is needed to write the changes to database

User.query.all()

User.query.filter_by(username='admin').first()

Il m'est arrivé que le pilote par défaut utilisé par SQLAlchemy (mqsqldb), ne soit pas compilé pour moi dans mes environnements virtuels. J'ai donc opté pour un pilote MySQL avec une implémentation complète python pymysql. Une fois que vous l'installez à l'aide de pip install pymysql, le SQLALCHEMY_DATABASE_URI deviendra:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'

Le but d'utiliser ORM comme SQLAlchemy est que, vous pouvez utiliser une base de données différente avec peu ou pas de changement dans la plupart des cas. Donc, ma réponse est oui. Vous devriez pouvoir utiliser votre code sqlite pour travailler avec MySQL avec l'URI mappé comme dans le code ci-dessus.

66
skjoshi

La réponse acceptée était correcte à l'époque, mais la syntaxe de l'instruction d'importation est déconseillée.

Cette:

from flask.ext.sqlalchemy import SQLAlchemy

Doit être remplacé par:

import flask_sqlalchemy

Étant donné que les questions concernant les connexions à la base de données ont tendance à générer du trafic et à rester pertinentes pendant une longue période, cela vaut la peine d'être enregistré.

La dépréciation est dans le Flask Version 1.0 Changelog , qui utilise en fait ce module dans l'exemple:

flask.ext - importez les extensions directement par leur nom au lieu de passer par l'espace de noms flask.ext. Par exemple, l'importation flask.ext.sqlalchemy devient import flask_sqlalchemy.

1