我有一个语言表,其内容相对静态:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Language(db.Model):
__tablename__ = 'languages'
# Fields
code = db.Column(db.String(2), primary_key=True)
name = db.Column(db.String(40))
native = db.Column(db.String(60))
rtl = db.Column(db.Boolean()) # right to left
data is in a CSV。我想将其插入数据库。我可以用除草剂吗?
我用以下方法初始化所有表(结构,而不是数据)
$ flask db init
$ flask db migrate
$ flask db update
(旁问:首先应该在数据库中,还是在代码中以CSV格式出现?我在CMS中使用它来允许用户指定说哪种语言/页面是哪种语言他们已经创建了。)
提供一个端点,该端点在被调用时会添加内容:
@app.route('/secret_init_languages')
def db_init_languages():
from mpu.string import str2bool
import csv
path = resource_filename('my_package', 'static/languages.csv')
nb_languages = 0
with open(path, 'rt', newline='') as csvfile:
csvreader = csv.reader(csvfile, delimiter=',')
next(csvreader, None) # skip the headers
for row in csvreader:
lang = Language(code=row[0],
name=row[1],
native=row[2],
rtl=str2bool(row[3]))
db.session.add(lang)
nb_languages += 1
db.session.commit()
return 'Added {} languages'.format(nb_languages)
此解决方案的缺点:
答案 0 :(得分:1)
不确定您是否已解决此问题,我在使用Flask和SQLAlchemy用csv初始化数据库表时遇到了类似的问题。以下解决方案对我有用(不使用alembic):
from main.app import app
from main.db import db
from models.table import TableModel
from pandas import read_csv
db.init_app(app)
@app.before_first_request
def create_tables():
db.create_all()
# Check if the existing table contain data, if not then initialize with csv insert
s = db.session()
if len(s.query(TableModel).all()) == 0:
print('No data in the table detected.')
print('Initialising the table in database.')
engine = s.get_bind()
df = read_csv('./table.csv')
df.to_sql('table',
con=engine,
if_exists='append',
chunksize=1000,
index=False)
app.run(port=5000, debug=True)
请注意,上面的代码包含在run.py
脚本中,该脚本分别从main.app和main.db模块调用flask应用程序对象和SQLAlchemy对象(来自flask-sqlalchemy)。 TableModel
是映射到数据库中所需表的类。我将@app.before_first_request
装饰器与pandas.DataFrame.to_sql
方法一起使用,以便数据库的初始化(包括从csv插入数据)仅在应用程序最初启动时执行一次。我不确定alembic
是否对您有用,但是pandas
确实对我有用,希望对您有所帮助。