相关疑难解决方法(0)

使用SQLAlchemy批量插入Pandas DataFrame

我有一些相当大的pandas DataFrames,我想使用新的批量SQL映射通过SQL Alchemy将它们上传到Microsoft SQL Server.pandas.to_sql方法虽然不错,但速度很慢.

我在编写代码时遇到了麻烦......

我希望能够将这个函数传递给我正在调用的pandas DataFrame,我正在调用table的模式名称schema,以及我正在调用的表名name.理想情况下,该函数将1.)删除表,如果它已经存在.2.)创建一个新表3.)创建一个mapper和4.)使用mapper和pandas数据批量插入.我被困在第3部分.

这是我的(诚然粗糙的)代码.我正在努力解决如何让mapper函数与我的主键一起工作.我真的不需要主键,但映射器功能需要它.

感谢您的见解.

from sqlalchemy import create_engine Table, Column, MetaData
from sqlalchemy.orm import mapper, create_session
from sqlalchemy.ext.declarative import declarative_base
from pandas.io.sql import SQLTable, SQLDatabase

def bulk_upload(table, schema, name):
    e = create_engine('mssql+pyodbc://MYDB')
    s = create_session(bind=e)
    m = MetaData(bind=e,reflect=True,schema=schema)
    Base = declarative_base(bind=e,metadata=m)
    t = Table(name,m)
    m.remove(t)
    t.drop(checkfirst=True)
    sqld = SQLDatabase(e, schema=schema,meta=m)
    sqlt = SQLTable(name, sqld, table).table
    sqlt.metadata = m
    m.create_all(bind=e,tables=[sqlt])    
    class MyClass(Base):
        return
    mapper(MyClass, sqlt)    

    s.bulk_insert_mappings(MyClass, table.to_dict(orient='records'))
    return
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy pandas

35
推荐指数
8
解决办法
5万
查看次数

如何使用to_sql将pandas数据框写入oracle数据库?

我是一名新的oracle学习者。我正在尝试将pandas数据框写入到oracle表中。在网上进行研究之后,我发现代码本身非常简单,但是我不知道为什么我的代码不起作用。

我已经从本地文件中读取了熊猫数据框:

import cx_Oracle
import pandas as pd
import os

dir_path = os.path.dirname(os.path.realpath("__file__"))
df = pd.read_csv(dir_path+"/sample.csv")
Run Code Online (Sandbox Code Playgroud)

现在打印df,数据框df的数据如下:

   DATE            YEAR     MONTH      SOURCE      DESTINATION
0  11/1/2017 1:00  2017     1          AL          CO  
1  11/2/2017 1:00  2017     5          GA          ID  
2  11/3/2017 1:00  2017     12         GA          MO    
Run Code Online (Sandbox Code Playgroud)

然后,我使用cx_Oracle创建与数据库的连接,它可以工作。接下来,我尝试将数据帧df写入表TEST中。该表TEST是一个空表,已经在oracle数据库中存在,它在oracle中具有DATE,YEAR,MONTH,SOURCE,DESTINATION列。所有数据类型都与df样本数据匹配。我的代码如下:

conn_str = u'account/password@host:1521/server'
conn = cx_Oracle.connect(conn_str)

# Write records stored in a DataFrame to a oracle database
df.to_sql('TEST', conn, if_exists='replace') # the error shows here

conn.close()
Run Code Online (Sandbox Code Playgroud)

它显示错误:

DatabaseError:在sql'SELECT name from sqlite_master WHERE type ='table'AND name = …

oracle cx-oracle dataframe pandas pandas-to-sql

5
推荐指数
1
解决办法
1万
查看次数

熊猫:如何用dtype对象识别列但是混合类型的项目?

在pandas数据框中,具有dtype = object的列实际上可以包含混合类型的项,例如整数和字符串.

在此示例中,列a是dtype对象,但第一个项是字符串,而所有其他项都是int:

import numpy as np, pandas as pd
df=pd.DataFrame()
df['a']=np.arange(0,9)
df.iloc[0,0]='test'
print(df.dtypes)
print(type(df.iloc[0,0]))
print(type(df.iloc[1,0]))
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有一种快速的方法来识别dtype = object包含哪些列,实际上是上面的混合类型?由于pandas没有dtype = str,因此不会立即显现出来.

但是,我遇到过将大型csv文件导入pandas的情况,我会收到如下警告:

sys:1: DtypeWarning: Columns (15,16) have mixed types. Specify dtype option on import or set low_memory=False
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法来复制它并明确列出具有混合类型的列?或者我是否需要手动逐个浏览它们,看看我是否可以将它们转换为字符串等?

背景是我正在尝试使用DataFrame.to_sql和SQLAlchemy将数据框导出到Microsoft SQL Server.我得到了

OverflowError: int too big to convert
Run Code Online (Sandbox Code Playgroud)

但我的数据帧不包含dtype int的列 - 只有object和float64.我猜这是因为其中一个对象列必须同时包含字符串和整数.

谢谢!

python sqlalchemy dataframe pandas

2
推荐指数
1
解决办法
1258
查看次数