2016-12-08 3 views
-1

Я пытаюсь добавить таблицу в уже существующую базу данных в SQLAlchemy. Мой app.db уже скомпилирован и заполнен данными. Я просто пытаюсь добавить новую таблицу в базу данных под названием song_points. (База данных отслеживает песни с течением времени)

Мои модели:SQLAlchemy Добавить таблицу в уже существующую базу данных

from app import db 

class songs (db.Model): 
    SongID = db.Column(db.Integer,primary_key=True, autoincrement=False) 
    Artist = db.Column(db.String(120), primary_key=True) 
    Title = db.Column(db.String(120), primary_key = True) 
    def __repr__(self): 
      return "%s, %s, %d\n" %(self.Artist, self.Title, self.SongID) 

class points(db.Model): 
    SongID = db.Column(db.Integer, db.ForeignKey("songs.SongID"), nullable= False, primary_key=True) 
    Genre = db.Column(db.String(25), primary_key=True) 
    Points = db.Column(db.Integer) 
    Date = db.Column(db.Date, primary_key=True) 
    Rank = db.Column(db.Integer) 
    def __repr__self(self): 
      return "%d, %s, %d\n" %(self.SongID, self.Genre, self.Points) 
class artist_points(db.Model): 
    Artist = db.Column(db.String(120), primary_key=True) 
    Points = db.Column(db.Integer) 
    def __repr__self(self): 
     return "%s, %d\n" %(self.Artist, self.Points) 

class graphs(db.Model): 
    SongID = db.Column(db.String(120), db.ForeignKey("songs.SongID"), nullable = False, primary_key = True) 
    URL = db.Column(db.String(120), primary_key=True) 
    def __repr__self(self): 
     return "%s, %s\n" %(self.SongID, self.URL) 

И вот мой сценарий создания БД:

from migrate.versioning import api 
from config import SQLALCHEMY_DATABASE_URI 
from config import SQLALCHEMY_MIGRATE_REPO 
from app import db 
import os.path 
db.create_all() 
if not os.path.exists(SQLALCHEMY_MIGRATE_REPO): 
    api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository') 
    api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
else: 
    api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO)) 

Это таблица Я пытаюсь добавить:

class song_points(db.Model): 
    SongID = db.Column(db.Integer,db.ForeignKey("songs.SongID"), nullable = False, primary_key = True) 
    Genre = db.Column(db.String(25), db.ForeignKey("points.Genre"), nullable = False, primary_key = True) 
    Points = db.Column(db.Integer) 
+0

Вы создали и запустить миграцию, так как при добавлении модели? – dirn

+1

http://alembic.zzzcomputing.com/ru/latest/ – davidism

ответ

2
song_points.__table__.create(db.session.bind) 
+4

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code -based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – DimaSan

+0

Ответ настолько прост, что неясно, какие объяснения могут быть необходимы. –

0

Следуйте инструкциям, приведенным в разделе Flask-Mega.

Во-первых, добавить вам новое определение таблицы в models.py

class song_points(db.Model): 
    SongID = db.Column(db.Integer,db.ForeignKey("songs.SongID"), nullable = False, primary_key = True) 
    Genre = db.Column(db.String(25), db.ForeignKey("points.Genre"), nullable = False, primary_key = True) 
    Points = db.Column(db.Integer) 

Во-вторых, добавить новый файл db_migrate.py для обновления БД:

import imp 
from migrate.versioning import api 
from app import db 
from config import SQLALCHEMY_DATABASE_URI 
from config import SQLALCHEMY_MIGRATE_REPO 
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
migration = SQLALCHEMY_MIGRATE_REPO + ('/versions/%03d_migration.py' % (v+1)) 
tmp_module = imp.new_module('old_model') 
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
exec(old_model, tmp_module.__dict__) 
script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata) 
open(migration, "wt").write(script) 
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
print('New migration saved as ' + migration) 
print('Current database version: ' + str(v)) 

После этого запустим python db_migrate.py, чтобы отразить все изменения в models.py. Я сделал код, выполняемый локально. Дайте мне знать, если вы все еще не можете заставить его работать.

BTW, в вашем коде должна быть одна коррекция. SONGID должен быть целым.

class graphs(db.Model): 
    SongID = db.Column(db.String(120), db.ForeignKey("songs.SongID"), nullable = False, primary_key = True) 

To:

class graphs(db.Model): 
    SongID = db.Column(db.Integer, db.ForeignKey("songs.SongID"), nullable = False, primary_key = True) 
Смежные вопросы