【问题标题】:How to Update and/or insert to MySQL DB using SQLAlchemy from Python List如何使用 Python 列表中的 SQLAlchemy 更新和/或插入 MySQL 数据库
【发布时间】:2020-03-18 23:18:26
【问题描述】:

我正在构建一个网络爬虫,它将一遍又一遍地运行,它将根据 ID 插入新数据或更新数据。 if 'id' == 'id': 我的目标是避免重复。 MySQL 表已准备好并已构建。在使用 SQLAlchemy 在 MySQL DB 中插入/更新之前检查 python 列表的最佳 Pythonic 方法是什么?

以下是我的依赖:

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session 
import requests
from bs4 import BeautifulSoup
from time import sleep
from datetime import datetime
import time
engine = create_engine("mysql+pymysql:///blah")

我使用一个函数从抓取的数据中分配每个<td>:

def functionscrape( **kwargs ):
    scrape = {
        'id': '',
        'owner': '',
        'street': '',
        'city': '', 
        'state': '', 
        }
    scrape.update(kwargs)
    return (scrape)

下面的列表是一个示例,但会随着每次网络抓取而不断变化。

myList = 
[{
        'id': '111',
        'owner': 'Bob',
        'street': '1212 North',
        'city': 'Anywhere', 
        'state': 'TX', 
        },
{
        'id': '222',
        'owner': 'Mary',
        'street': '333 South',
        'city': 'Overthere', 
        'state': 'AZ', 
        }]

【问题讨论】:

    标签: python mysql web-scraping sqlalchemy mysql-python


    【解决方案1】:

    我正在使用辅助函数来创建动态 sql 更新查询:

    def construct_update(table_name, where_vals, update_vals):
        query = table_name.update()
        for k, v in where_vals.items():
            query = query.where(getattr(table_name.c, k) == v)
        return query.values(**update_vals)
    

    基本上,您将函数传递给表和 2 个字典。在您的情况下,第一个只是 {'id': id} ,第二个是您要更新的所有值,例如

    {
        'owner': 'Bob',
        'street': '1212 North',
        'city': 'Anywhere', 
         etc...
    }
    

    helper 函数然后返回可以用

    执行的查询
    my_session = Session(engine)
    my_session.execute(query)
    

    不幸的是,使用这种方法,您必须单独更新每一行(没有批量更新) - 但如果您能接受,这很好

    否则这里有一篇关于批量更新的类似帖子: Bulk update in SQLAlchemy Core using WHERE

    【讨论】:

      【解决方案2】:

      您可以尝试使用https://marshmallow.readthedocs.io/en/stable/库进行验证

      构建Schema 并使用您需要的类型定义字段。您还可以使用 @pre_load 和 @post_load 装饰器来操作您的数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 2012-08-31
        • 2011-05-30
        相关资源
        最近更新 更多