Инициировать базу данных фляги из текстового файла - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь добавить в свою базу данных sqlalchemy название всего фильма из текстового файла в виде элемента.

но, похоже, я могу использовать обычный метод (например, open('filename')) для чтения текстового файла в файле моего приложения.

Так что я пытаюсь сделать это в другом файле, но мне не удается импортировать БД (база данных)

пришло сообщение об ошибке:

ImportError: cannot import name 'db' from '__main__' (/home/chrys/deploy/initdata.py)

каталог

deploy/
      |api.py      #the app file 
      |initdata.py # the file where i try to import title fom txt file

здесь код инициализации:

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy


from . import db
from api import Movie

file = open("movie_t-utf8.txt", "r")
to_add =[]
for line in file.readlines():
    item = line.split('|')
    if item[1][-1:] == '\n':
        item[1] = item[1][:-1]
    film = Movie(id = item[0], title=item[1])
    db.session.add(film)
db.session.commit()

А вот код API:

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

#print(os.listdir("../deploy"))
app = Flask(__name__)
app.config["DEBUG"] = True

SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://{username}:{password}@{hostname}/{databasename}".format(
    username="user",
    password="00000000",
    hostname="user.mysql.pythonanywhere-services.com",
    databasename="user$movies",
)
app.config["SQLALCHEMY_DATABASE_URI"] = SQLALCHEMY_DATABASE_URI
app.config["SQLALCHEMY_POOL_RECYCLE"] = 299
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False


db = SQLAlchemy(app)
ma = Marshmallow(app)

class Movie(db.Model):

    __tablename__ = "movies"

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200))
db.drop_all()
db.create_all()
film = Movie(id = 1, title="Star Wars")
db.session.add(film)
db.session.commit()

class MovieSchema(ma.ModelSchema):
    class Meta:
        model = Movie



@app.route('/', methods=['GET'])
def index():
    return jsonify({'message' : 'Deployeeeeded'})

@app.route('/film', methods=['GET'])
def returnAll():
    one_film = Movie.query.first()
    movie_schema = MovieSchema()
    output = movie_schema.dump(one_film).data
    return jsonify({ 'film' : output})

if __name__ == '__main__':
    app.run()

Заранее спасибо за любую помощь

1 Ответ

0 голосов
/ 16 сентября 2018

Я не уверен, что именно вы пытаетесь сделать, но если вы просто хотите импортировать вашу базу данных из txt, вам следует рассмотреть возможность использования Flask-Script.

Пример из одного моего проекта:

from config import Config
from edulya.app import create_app

app = create_app(Config)

from flask_script import Manager
from edulya.app import db

path = os.path.realpath(os.path.dirname(__file__))

manager = Manager(app)

@manager.command
def init_schools():
    with open(
        os.path.join(
            path, 'edulya', 'static_data', 'fr-en-annuaire-education.json'
        ), 'r'
    ) as file:
        json_data = ujson.loads(file.read())
        for data in json_data:
            School.from_json(data)

и School.from_json выглядит примерно так:

class School(db.Model):
    @staticmethod
    def from_json(data):
        school = School(
           id_commune=data['code_commune'],
            id_academie=data['code_academie'],
            status=data['statut_public_prive'],
            updated=datetime.strptime(data['date_maj_ligne'], '%Y-%m-%d')
        )

        db.session.add(school)
        db.session.commit()

и затем py manager.py init_schools

...