Python 从JSON数据大容量插入SQLAlchemy
我第一次尝试使用ORM,试图了解它是如何工作的,但遇到了一些挑战: 我试图做的是,将API中的JSON放入SQLAlchemy模型,然后将所有条目批量插入数据库。但由于某种原因,我在SQLAlchemy中遇到了一个错误 从我对错误的理解来看,在某个时间点,当将数据分配给我的模型时,它被转换为dict,而我认为它应该是Python 从JSON数据大容量插入SQLAlchemy,python,python-3.x,flask,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Flask,Sqlalchemy,Flask Sqlalchemy,我第一次尝试使用ORM,试图了解它是如何工作的,但遇到了一些挑战: 我试图做的是,将API中的JSON放入SQLAlchemy模型,然后将所有条目批量插入数据库。但由于某种原因,我在SQLAlchemy中遇到了一个错误 从我对错误的理解来看,在某个时间点,当将数据分配给我的模型时,它被转换为dict,而我认为它应该是类对象的列表 我的预期结果是成功插入所有条目。谁能帮我弄清楚我可能做错了什么 谢谢* 错误 sqlalchemy.exc.ProgrammingError: (mysql.conne
类对象的列表
我的预期结果是成功插入所有条目。谁能帮我弄清楚我可能做错了什么
谢谢*
错误
sqlalchemy.exc.ProgrammingError:
(mysql.connector.errors.ProgrammingError)
Failed processing pyformat-parameters;
Python 'dict' cannot be converted to a MySQL type
JSON:
{
"all_orders": [
{
"id": 456215587,
"created_at": "2018-11-04T23:18:18-02:00",
"order_number": null,
},
{
"id": null,
"created_at": "2018-11-04T23:18:18-02:00",
"order_number": 1982,
}]
}
功能
def update_orders(all_orders):
cursor = db_cursor()
session = db_session()
orders_entries = []
for orders in all_orders:
order_id = orders.get("id", {})
order_number = orders.get("order_number", {})
created_at = orders.get("created_at", {})
new_entry = SalesOrders(order_id=order_id,
order_number=order_number,
created_at=created_at)
orders_entries.append(new_entry)
session.add_all(orders_entries)
session.commit()
模型
class SalesOrders(db.Model):
__tablename__ = 'sales_orders'
id = Column(Integer, nullable=False, index=True)
order_id = Column(String(50), primary_key=True, server_default=text("''"))
order_number = Column(String(50))
created_at = Column(String(100))
编辑以使其可验证。
函数.get()正在创建一个字典,而不是一个None
对象,SQLAlchemy无法插入Python字典。使用get()
函数时,SQLAlchemy正在获取一个dict,这在SQL insert函数中是不需要的,它会产生错误。
要使其工作,只需传递None
对象,而不是{}
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import *
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'main.db')
db = SQLAlchemy(app)
data = {
"all_orders": [
{
"id": 456213548,
"created_at": "2018-11-04T23:18:18-02:00",
"number": null
},
{
"id":4562222222,
"created_at": "2018-11-04T23:18:18-02:00",
"number": 1982,
}
]
}
class SalesOrders(db.Model):
__tablename__ = 'sales_orders'
order_id = db.Column(db.String(50), primary_key=True, server_default='')
order_number = db.Column(db.String(50))
created_at = db.Column(db.String(50))
def update_orders(data):
orders_entries = []
for orders in data["all_orders"]:
new_entry = SalesOrders(order_id=orders['id'],
order_number=orders['number'])
orders_entries.append(new_entry)
db.session.add_all(orders_entries)
db.session.commit()
if __name__ == "__main__":
app.run(debug=True)
例如:
>>> import app
>>> from app import *
>>> data
{'all_orders': [{'id': 456213548, 'created_at': '2018-11-04T23:18:18-02:00', 'number': 1982}, {'id': 4562222222, 'created_at': '2018-11-04T23:18:18-02:00', 'number': 1982}]}
>>> update_orders(data)
>>> SalesOrders.query.all()
[<SalesOrders 456213548>, <SalesOrders 4562222222>]
导入应用程序
>>>从应用程序导入*
>>>资料
{'all_orders':[{'id':456213548',created_at':'2018-11-04T23:18:18-02:00','number':1982},{'id':45622222',created_at':'2018-11-04T23:18:18-02:00','number':1982}
>>>更新订单(数据)
>>>SalesOrders.query.all()
[, ]
“PS:Nevermind字段名,我编辑代码使其更小。”这不是不提供可验证的。您提供的代码和数据包含多个错误,但不是您询问的错误。您是对的。我将尝试在不粘贴大量代码的情况下使其可验证。@IljaEverilä编辑它以使其可验证,并最终发现问题。谢谢你的意见。谢谢。正如上面一位用户所指出的,这个问题无法正确验证,因为ID确实是唯一的。发生的事情是,我使用了get()
函数和{}
作为参数,因此SQLAlchemy将输入理解为Python Dict。如果您可以调整您的答案以记录“真正的”问题,我将接受它。谢谢。order\u id=orders['id']
和order\u id=orders.get之间的区别('id',default='some_value')
是第一种方法,如果未找到id
键,则会引发KeyError
,而第二种方法默认为some_value
。在您的情况下,它默认为一个空字典{}
。谢谢,就是这样。由于对get()缺乏了解,我花了很长时间才意识到这一点。)
功能。