在Flask中用SQLAlchemy来插入字典数据,常用方法可能是这样的:
1 2 3 4 5 item = {'name' : 'foo' , 'value' : 42.0 } instance = MyModel(name=item['name' ], value=item['value' ]) db.session.add(instance) db.session.commit()
创建一个MyModel类型的实例instance,然后用add方法添加到数据库后提交一下就行了。
然后就有个小问题来了,如果这个数据库表的字段有十几二十个,那这个创建实例的时候就要写十几二十个参数吗?这也太长了。
于是,懒人就发现了另一个方法 :
1 2 3 4 5 item = {'name' : 'foo' , 'value' : 42.0 } instance = MyModel(**item) db.session.add(instance) db.session.commit()
这样不管有多少个字段,就简洁多了!
完整的代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI' ] = 'sqlite:///db/test.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False db = SQLAlchemy(app) class MyModel (db.Model ): id = db.Column(db.Integer, primary_key=True ) name = db.Column(db.String(80 )) value = db.Column(db.Float) def insert_data (): data = [ {'name' : 'foo' , 'value' : 42.0 }, {'name' : 'bar' , 'value' : 23.0 }, {'name' : 'baz' , 'value' : 13.0 }, ] for item in data: instance = MyModel(name=item['name' ], value=item['value' ]) db.session.add(instance) db.session.commit() def insert_data2 (): data = [ {'name' : 'foo' , 'value' : 42.0 }, {'name' : 'bar' , 'value' : 23.0 }, {'name' : 'baz' , 'value' : 13.0 }, ] with app.app_context(): try : for item in data: instance = instance = MyModel(**item) db.session.add(instance) db.session.commit() except Exception as e: db.session.rollback() print (e) def db_init (): with app.app_context(): db.drop_all() db.create_all() if __name__ == '__main__' : db_init() insert_data2()
PS.注意 'sqlite:///db/test.db'
数据库连接这里:
sqlite连接字符串中的/斜杠说明:三斜杠为相对路径,四斜杠为绝对路径 比如这里相对路径 test.db 文件是在当前项目目录下的db目录下