![](/img/trans.png)
[英]Bulk Insert Using Sqlalchemy and Pandas on Many to Many Relationship
[英]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.