Python 3.x 用SQLAlchemy一次替换大量数据?
我需要每天更新大量数据(大意味着>3MB)。我想将其存储为JSON,但据我所知,SQLAlchemy不支持从JSON转换。所以现在我试着用泡菜来做。目前,我正在将我所有的产品都存储在一个巨大的Pickle文件中,以便稍后加载并提交它们。然而,我不断收到错误,说我的产品类没有映射,我不知道这意味着什么或如何修复它。我在谷歌搜索时遇到的一切都与我的代码一点也不相似。 以下是我的产品类别:Python 3.x 用SQLAlchemy一次替换大量数据?,python-3.x,sqlalchemy,pickle,Python 3.x,Sqlalchemy,Pickle,我需要每天更新大量数据(大意味着>3MB)。我想将其存储为JSON,但据我所知,SQLAlchemy不支持从JSON转换。所以现在我试着用泡菜来做。目前,我正在将我所有的产品都存储在一个巨大的Pickle文件中,以便稍后加载并提交它们。然而,我不断收到错误,说我的产品类没有映射,我不知道这意味着什么或如何修复它。我在谷歌搜索时遇到的一切都与我的代码一点也不相似。 以下是我的产品类别: class Product: id = "" name = "&q
class Product:
id = ""
name = ""
store_name = ""
brand = ""
price = ""
amount = ""
info = ""
image = ""
这是我的Pickle/数据库代码:
def loadall():
with open('products.txt', mode='rb') as products_txt:
while True:
try:
yield pickle.load(products_txt)
except EOFError:
break
Session = sessionmaker(bind=db)
session = Session()
products = loadall()
with db.connect() as conn:
session.add_all(products)
session.commit()
(阅读后制作)下面应该给你一个想法(我将测试数据限制在两列之内):
test.py:
#!/usr/bin/env python3
import json
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import Session, as_declarative, registry
## configuration
engine = create_engine("sqlite+pysqlite:///:memory:", echo=True, future=True)
mapper_registry = registry()
@as_declarative()
class Base(object):
pass
class Product(Base):
__tablename__ = "product"
id = Column("id", Integer, primary_key=True)
name = Column(String)
info = Column(String)
def _main():
with Session(engine) as session:
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
## test data
objects = [
Product(name="no-info"),
Product(name="red-color", info="large RED"),
]
session.add_all(objects)
session.commit()
session.expunge_all()
## test data: from JSON
# product_list = load_all_test() # load from test code
product_list = load_all_file() # load from the file
print(product_list)
# create Product() instances from JSON
products = [Product(**kw) for kw in product_list]
session.add_all(products)
session.commit()
def load_all_test():
test_json_content = """
[
{ "name": "json-product-1", "info": "some info from json-1" },
{ "name": "json-product-2", "info": "some info from json-2" }
]
"""
product_list = json.loads(test_json_content)
return product_list
def load_all_file():
with open("myjsonfile.json") as fh:
product_list = json.load(fh)
return product_list
_main()
我知道这不是你的问题,但SqlAlchemy现在明确支持,SqlAlchemy的目标不是从JSON或任何其他数据格式转换;但使用python标准库可以很容易地做到这一点,我更喜欢使用它而不是pickle。如果它能帮助我解决我的问题,我很乐意尝试一下!我一直在寻找和摆弄您链接的JSON实现,但我无法让它工作。他们使用table.insert(),但我在本地没有表,我只是从桌面连接到它。您可能知道我如何解决这个问题吗?如果您使用的是ORM,您可以通过访问
产品来创建表。但是你不需要。但是,如果您想在数据库中使用JSON列,那么表的设计将有所不同:您将拥有JSON列,它将一些属性存储为JSON。我不建议您对定义良好的属性这样做。我只想指出,sqlalchemy可以处理JSON。我最初通过使用文本文件存储整个查询来解决这个问题,不过这要优雅得多。谢谢