簡體   English   中英

使用 sqlalchemy 批量插入多行

[英]Bulk insert many rows using sqlalchemy

我想使用 Python 將數千行插入到 Oracle db 中。為此,我嘗試插入sqlalchemy session的 bulk_insert_mappings 方法。我正在學習教程,它展示了如何將 csv 文件快速加載到數據庫中。 我失敗了,因為bulk_insert_mappings 還需要一個映射器 object ,但它們沒有通過。

在沒有 csv 的情況下創建連接和映射的代碼:

from sqlalchemy.sql import select, sqltypes
from sqlalchemy.schema import CreateSchema
from sqlalchemy import create_engine, MetaData, Table, inspect, engine, Column, String, DateTime, insert
from sqlalchemy.orm import sessionmaker
from sqlalchemy_utils import get_mapper
import pytz
import datetime
import pandas as pd

engine_url = engine.URL.create(
            drivername='oracle',
            username='ADMIN',
            password='****',
            host='***',
            database='****',    
        )


oracle_engine = create_engine(engine_url, echo=False)
Session = sessionmaker(bind=oracle_engine)

base = datetime.datetime.today().replace(tzinfo=pytz.utc)
date_list = [base - datetime.timedelta(days=x) for x in range(20)]
df = pd.DataFrame(date_list, columns = ['date_time'])

如果不存在,我使用以下代碼行創建表:

df[:0].to_sql('test_insert_df', oracle_engine, schema='ADMIN', if_exists='replace')

我用這一行將數據插入表中:

with Session() as session:
    session.bulk_insert_mappings(df.to_dict('records'))

我收到的回溯如下:

TypeError: bulk_insert_mappings() missing 1 required positional argument: 'mappings'

如果不使用 sqlalchemy ORM 創建表,如何創建映射器? 看着這個問題,我知道如何使用 sqlalchemy model 創建映射器 object 但不是。

我也可以選擇使用bulk_insert_objects方法進行插入,但這也需要一個我沒有的 model

PS:我這樣做是因為我想使用sqlalchemy將許多行插入到Oracle數據庫中。如果您有更好的解決方案,也歡迎提供。

最簡單的插入方法是使用數據框的to_sql方法,但如果你想使用 SQLAlchemy ,你可以使用它的核心功能來插入數據。 在您的用例中無需使用 ORM。 假設您使用的是 SQLAlchemy 1.4 並且您可以將數據安排為字典列表,這樣的事情應該可行:

import sqlalchemy as sa

...

tbl = sa.Table('test_insert_of', sa.MetaData(), autoload_with=engine)
ins = tbl.insert()

with engine.begin() as conn:
    # This will automatically commit
    conn.execute(ins, list_of_dicts)

如果您有大量數據,您可能希望分批插入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM