完成前的StringIO清除

时间:2018-08-21 13:38:35

标签: python stringio

我什至不确定这是否是执行此操作的最佳方法,但是,我正在从url中获取一系列数据并将其加载到熊猫中以进行一些表清理(列重命名,格式化日期等)。

每个url都是唯一的,但实际上只是分页数据(特别是odata链接)。然后,我从数据帧进行StringIO sql查询,并使用sqlalchemy将数据加载到mssql中。

表1正确加载,但是从那里其他表很短。我认为StrionIO对象在完成之前就已被重写,但我想也许另一双眼睛可以看到我看不到的东西。一些表有3000行,而另一些表可能有300,000。每次运行时,链接和表的数量都会不同。因此,一次可能有30个链接,总共填充6个表,而下一次可能有一半。

我无法发布指向数据的链接,但是如果您想要数据。

localengine = create_engine ("mssql://Username:Password@myServer/myDB?"\
"driver=SQL+Server+Native+Client+11.0")

localconn = localengine.connect()

# CREATE THE BUFFER TO STORE THE SQL INSERT STATEMENTS
buf = StringIO()

# THIS CREATES THE INSERT STATEMENT
def SQL_INSERT_STATEMENT_FROM_DATAFRAME(SOURCE, TARGET):
    print ("Writing to Buffer")
    sql_text = []

    for index, row in SOURCE.iterrows():
        sql_text = 'INSERT INTO '+TARGET + \
        '_union (' + str(', '.join(SOURCE.columns)) + ') VALUES ' + str(tuple(row.values))
        buf.write(sql_text)
    t = buf.getvalue()
    return t 

因此,我将数据框传递给函数,并获取用于创建表的stringio对象。 item是我要遍历的表名。

rows = [4000, 3000, 670000, 50000,80000,67000,480000]
for i in rows:
    df = pd.DataFrame(np.random.randint(0,100,size=(i, 150)))
    g = SQL_INSERT_STATEMENT_FROM_DATAFRAME(df, item)
    insert_query = sqlalchemy.text(g)
    localconn.execution_options(autocommit=True).execute(insert_query)
    print ("done")
    # CLEAR THE BUFFER
    buf.truncate(0)

就像我说的那样,第一个表加载的行数正确,但是之后没有加载,因此我认为缓冲区对象可能在完成前被覆盖,或者表会话即将关闭。我试图包括尽可能多的代码以模仿我的工作流程。关于如何克服这一点的任何想法?

0 个答案:

没有答案