Import csv works! Many to many books and authors is also nice

geo
Alice 7 years ago
parent e6bc9a7ff9
commit d4f23ab507

@ -1,6 +1,11 @@
from app import db from app import db
from marshmallow import Schema, fields, ValidationError, pre_load from marshmallow import Schema, fields, ValidationError, pre_load
authors = db.Table('books_authors',
db.Column('book_id', db.Integer, db.ForeignKey('books.id'), primary_key=True),
db.Column('author_id', db.Integer, db.ForeignKey('authors.id'), primary_key=True)
)
class Book(db.Model): class Book(db.Model):
__tablename__ = 'books' __tablename__ = 'books'
id = db.Column(db.Integer, primary_key = True) id = db.Column(db.Integer, primary_key = True)
@ -8,9 +13,10 @@ class Book(db.Model):
file = db.Column(db.String(255)) file = db.Column(db.String(255))
cover = db.Column(db.String(255)) cover = db.Column(db.String(255))
fileformat = db.Column(db.String(255)) fileformat = db.Column(db.String(255))
author = db.relationship('Author')
tag = db.Column(db.String(255)) tag = db.Column(db.String(255))
authors = db.relationship('Author', secondary=authors, lazy='subquery',
backref=db.backref('books', lazy=True))
def __init__(self, title, file, cover, fileformat, tag): def __init__(self, title, file, cover, fileformat, tag):
self.title = title self.title = title
@ -30,7 +36,7 @@ class Book(db.Model):
class Author(db.Model): class Author(db.Model):
__tablename__ = 'authors' __tablename__ = 'authors'
id = db.Column(db.Integer(), primary_key=True) id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('books.id')) book_id = db.Column(db.Integer(), db.ForeignKey('books.id'))
author_name = db.Column(db.String(50)) author_name = db.Column(db.String(50))

@ -1,7 +1,7 @@
#import click #import click
#from flask import Flask #from flask import Flask
from app import app, db from app import app, db
from app.models import Book from app.models import Book, Author
from csv import DictReader from csv import DictReader
import argparse import argparse
@ -9,14 +9,27 @@ ap = argparse.ArgumentParser("import csv into flask")
ap.add_argument("csv", help = "csv file to import") ap.add_argument("csv", help = "csv file to import")
ap.add_argument("--limit", type=int, default = None, help = "limit to x number of x") ap.add_argument("--limit", type=int, default = None, help = "limit to x number of x")
args = ap.parse_args() args = ap.parse_args()
with open(args.csv) as f:
for row in DictReader(f):
book = Book(row['Title'], '', '', row['Format'], row['Shelf'])
db.session.add(book)
authors = row['Author'].split(',')
authors = [x.strip() for x in authors]
for author in authors:
if author:
a = db.session.query(Author).filter_by(author_name=author).first()
if a == None:
a = Author(author_name=author)
db.session.add(a)
book.authors.append(a)
print(args)
#app = Flask(__name__) #print(row['Title'], authors)
books = db.session.query(Book).all() print(a)
#print(books)
# @app.cli.command() print(book)
# @click.argument('name') db.session.commit()
# def import_csv(name): #print(args)
# print("hello")
books = db.session.query(Book).all()

Loading…
Cancel
Save