Переключение с SQLite на MySQL с помощью Flask SQLAlchemy
У меня есть сайт, который я создал с помощью Flask SQLAlchemy и SQLite, и мне нужно переключиться на MySQL. Я сам переместил базу данных и запущен в MySQL, но
- Невозможно выяснить, как подключиться к базе данных MySQL (то есть, что должно быть
SQLALCHEMY_DATABASE_URI
) и
- Неясно, будет ли какой-либо из моего существующего SQLite-кода SQLAlchemy работать с MySQL.
Я подозреваю, что (1) довольно прост, и просто вопрос о том, как отображать, например, содержимое диалогового окна подключения, которое я использую в своем инструменте базы данных MySQL, для соответствующего отформатированного URL. Но я беспокоюсь о (2), я предположил, что SQLAlchemy предоставил уровень абстракции, чтобы простой код SQLAlchemy, например
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 работать без каких-либо изменений, кроме соответствующего изменения в URI базы данных; но примеры, которые я нашел для использования SQLAlchemy с MySQL, похоже, используют совершенно другой API.
Могу ли я (2) перенести свой код SQLAlchemy Flask для работы с базой данных MySQL, просто изменив URI базы данных и если да (1), что должен делать этот URI?
Ответы
Ответ 1
Указанный вами урок показывает правильный способ подключения к MySQL с помощью SQLAlchemy. Ниже приведен ваш код с очень небольшими изменениями:
Мои предположения - ваш сервер MySQL работает на том же компьютере, на котором запущена Flask, а имя базы данных - db_name. Если ваш сервер не такой же, поставьте IP-адрес сервера вместо localhost
.
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:[email protected]/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()
Случилось так, что драйвер по умолчанию, используемый SQLAlchemy
(mqsqldb
), не компилируется для меня в моих виртуальных средах. Поэтому я выбрал драйвер MySQL с полной реализацией python pymysql
. Как только вы установите его с помощью pip install pymysql
, SQLALCHEMY_DATABASE_URI изменится на:
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:[email protected]/db_name'
Цель использования ORM, например SQLAlchemy, заключается в том, что вы можете использовать различные базы данных с небольшими изменениями или вообще без изменений в большинстве случаев. Итак, мой ответ - да. Вы должны иметь возможность использовать свой код sqlite для работы с MySQL с URI, отображаемым как в приведенном выше коде.
Ответ 2
Принятый ответ был верным в то время, но синтаксис в операторе импорта устарел.
Это:
from flask.ext.sqlalchemy import SQLAlchemy
Должен быть заменен на:
import flask_sqlalchemy
Поскольку вопросы, касающиеся соединений с базой данных, как правило, привлекают трафик и остаются актуальными в течение длительного времени, их стоит записать.
Устаревание находится в журнале изменений Flask версии 1.0, который фактически использует этот модуль в следующем примере:
flask.ext - импортировать расширения напрямую по их имени, а не через пространство имен flask.ext. Например, import flask.ext.sqlalchemy становится import flask_sqlalchemy.