Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy从JSON列表插入数据库_Python_Json_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy从JSON列表插入数据库

Python SQLAlchemy从JSON列表插入数据库,python,json,sqlalchemy,Python,Json,Sqlalchemy,我有一个带有JSON的列表,如下所示: print(type(listed)) # <class 'list'> print (listed) [ { "email": "x@gmail.com", "fullname": "xg gf", "points": 5, "image_url", "https://imgur.com/random.pmg" }, { ... similar jso

我有一个带有JSON的列表,如下所示:

print(type(listed)) # <class 'list'>
print (listed)

[
   {
       "email": "x@gmail.com",
       "fullname": "xg gf",
       "points": 5,
       "image_url", "https://imgur.com/random.pmg"
   },
   {
        ... similar json for the next user and so on
   }
]

但是我很困惑,我尝试了几种方法,但都没有成功,任何人都可以用一个例子来指导我如何正确地完成它?

下面是一个json列表示例,就像您提供的一样

json = [
   {
       "email": "x@gmail.com",
       "fullname": "xg gf",
       "points": 5,
       "image_url": "https://imgur.com/random.pmg"
   },
    {
       "email": "onur@gmail.com",
       "fullname": "o g",
       "points": 7,
       "image_url": "https://imgur.com/random_x.pmg"
   }
]
现在创建一个空数据框all_df并在json列表中运行迭代。 每次迭代都会使用列表中的字典中的数据创建一个数据帧,将其转置并附加到所有_df中

输出:

现在,您可以继续创建一个会话到您的数据库,并推送所有会话


下面是一个示例json列表,如您提供的

json = [
   {
       "email": "x@gmail.com",
       "fullname": "xg gf",
       "points": 5,
       "image_url": "https://imgur.com/random.pmg"
   },
    {
       "email": "onur@gmail.com",
       "fullname": "o g",
       "points": 7,
       "image_url": "https://imgur.com/random_x.pmg"
   }
]
现在创建一个空数据框all_df并在json列表中运行迭代。 每次迭代都会使用列表中的字典中的数据创建一个数据帧,将其转置并附加到所有_df中

输出:

现在,您可以继续创建一个会话到您的数据库,并推送所有会话


这里有一个没有熊猫的解决方案,使用SQLAlchemy核心

创建引擎

engine = sqlalchemy.create_engine('...')
使用引擎作为绑定参数加载元数据

metadata = sqalchemy.Metadata(bind=engine)
参考表格

users_table = sqlalchemy.Table('users', metadata, autoload = True)
然后可以开始插入

for user in json:
    query = users_table.insert()
    query.values(**user)

    my_session = Session(engine)
    my_session.execute(query)
    my_session.close()

这将为json中的每个用户创建一个会话,但我认为您可能会喜欢它。它非常灵活,适用于任何桌子,你甚至不需要模型。只需确保json不包含数据库中不存在的任何列,这意味着您需要在json键和数据库列名中使用img_url列名

创建引擎

engine = sqlalchemy.create_engine('...')
使用引擎作为绑定参数加载元数据

metadata = sqalchemy.Metadata(bind=engine)
参考表格

users_table = sqlalchemy.Table('users', metadata, autoload = True)
然后可以开始插入

for user in json:
    query = users_table.insert()
    query.values(**user)

    my_session = Session(engine)
    my_session.execute(query)
    my_session.close()
这将为json中的每个用户创建一个会话,但我认为您可能会喜欢它。它非常灵活,适用于任何桌子,你甚至不需要模型。只需确保json不包含数据库中不存在的任何列,这意味着您需要在json键和数据库列名中使用img_url列名

验证传入的JSON 为加载和转储数据创建通用实用程序 定义模式

schema.py

utils.py

下面的确切细节无关紧要,但创建一个通用实用程序,用于从JSON到ORM对象以及从ORM对象到JSON。schema_partial用于自动生成的主键

def loadData(data, schema_partial, many=False,
             schema_full=None, instance=None):
    try:
        if instance is not None:
            answer = schema_full.load(data, instance=instance, many=many)
        else:
            answer = schema_partial.load(data, many=many)
    except ValidationError as errors:
        raise InvalidData(errors, status_code=400)
    return answer


def loadUser(data, instance=None, many=False):
    return loadData(data=data,
                    schema_partial=user_schema_full,
                    many=many,
                    schema_full=user_schema_full,
                    instance=instance)

def dumpData(load_object, schema, many=False):
    try:
        answer = schema.dump(load_object, many=many)
    except ValidationError as errors:
        raise InvalidDump(errors, status_code=400)
    return answer


def dumpUser(load_object, many=False):
    return dumpData(load_object, schema=user_schema_full, many=many)
在api中使用loadUser和dumpUser生成干净的平面代码。 api.py

使用

验证传入的JSON 为加载和转储数据创建通用实用程序 定义模式

schema.py

utils.py

下面的确切细节无关紧要,但创建一个通用实用程序,用于从JSON到ORM对象以及从ORM对象到JSON。schema_partial用于自动生成的主键

def loadData(data, schema_partial, many=False,
             schema_full=None, instance=None):
    try:
        if instance is not None:
            answer = schema_full.load(data, instance=instance, many=many)
        else:
            answer = schema_partial.load(data, many=many)
    except ValidationError as errors:
        raise InvalidData(errors, status_code=400)
    return answer


def loadUser(data, instance=None, many=False):
    return loadData(data=data,
                    schema_partial=user_schema_full,
                    many=many,
                    schema_full=user_schema_full,
                    instance=instance)

def dumpData(load_object, schema, many=False):
    try:
        answer = schema.dump(load_object, many=many)
    except ValidationError as errors:
        raise InvalidDump(errors, status_code=400)
    return answer


def dumpUser(load_object, many=False):
    return dumpData(load_object, schema=user_schema_full, many=many)
在api中使用loadUser和dumpUser生成干净的平面代码。 api.py


你想用简单的python和psycopg2吗?我正在尝试用flask_sqlalchemy import sqlalchemy@jawad khanDo来做这件事你想用简单的python和psycopg2来做吗?我正在尝试用flask_sqlalchemy import sqlalchemy@jawad khanThanks来做这件事!哪个包裹是pd?我没有在任何地方定义它,如果_exists作为参数通常会做什么?感谢您的编辑,只是想知道,如果不依赖panda包,是否就没有办法做到这一点?我正在使用flask_sqlalchemy import sqlalchemy Please,我编辑了我的答案以包含packagepandas。根据我的经验,如果_exists通常采用append或replace,append会将数据添加到现有表中,replace会删除表中的原始数据,然后推送数据。编辑:我真的不知道如果没有潘达斯银行的答案,你怎么能做到这一点!哪个包裹是pd?我没有在任何地方定义它,如果_exists作为参数通常会做什么?感谢您的编辑,只是想知道,如果不依赖panda包,是否就没有办法做到这一点?我正在使用flask_sqlalchemy import sqlalchemy Please,我编辑了我的答案以包含packagepandas。根据我的经验,如果_exists通常采用append或replace,append会将数据添加到现有表中,replace会删除表中的原始数据,然后推送数据。编辑:我真的不知道没有熊猫你怎么能做到这一点