2016-12-06 3 views
0

Ich benutze Python (Version 3.4.4), Pandas (Version 0.19.1) und Sqlalchemy (Version 1.1.4), um chunkwise aus einer großen SQL-Tabelle zu lesen , verarbeiten Sie diese Chunks vor und schreiben Sie sie in eine andere SQL-Tabelle. Die kontinuierliche BROCKENWEISE mit pd.read_sql_query(verses_sql, conn, chunksize=10) lesen, wo pd Pandas Import ist, ist verses_sql die SQL-Abfrage und conn ist die DB-API-Verbindung, funktioniert gut, wenn ich tun:Wie chunkwise lesen und schreiben mit pandas und sqlalchemy

import pandas as pd 
from sqlalchemy import create_engine 

engine = create_engine('mssql+pymssql://<username>:<password>@<database>:1433/<FirstTable>') 
conn = engine.connect() 

verses_sql = '''SELECT [KA_Lang] FROM [dbo].[<FirstTable>]''' 

for chunk in pd.read_sql_query(verses_sql, conn, chunksize=10): 
    chunk['KA_Lang'] = chunk['KA_Lang'].str.replace(r'[^a-zA-Z\u00C0-\u02AF]'," ") 
    chunk['KA_Lang'] = chunk['KA_Lang'].str.replace(r'\s\s+', " ") 
    chunk['KA_Lang'] = chunk['KA_Lang'].str.lower() 
    print(chunk['KA_Lang'].head(1)) 

Hier ist das Problem: Wenn ich versuche, schreibe die vorverarbeiteten Chunks chunk['KA_Lang'] in eine zweite SQL-Tabelle, nennen wir es SecondTable, nur der erste Chunk von 10 Elementen wird übergeben. Die Iteration stoppt dort. Hier ist der angepasste Code:

import pandas as pd 
from sqlalchemy import create_engine 
from sqlalchemy import Table, Column, Integer, String, MetaData 

engine = create_engine('mssql+pymssql://<username>:<password>@<database>:1433/<FirstTable>') 
conn = engine.connect() 

verses_sql = '''SELECT [KA_Lang] FROM [dbo].[<FirstTable>]''' 

for chunk in pd.read_sql_query(verses_sql, conn, chunksize=10): 
    chunk['KA_Lang'] = chunk['KA_Lang'].str.replace(r'[^a-zA-Z\u00C0-\u02AF]'," ") 
    chunk['KA_Lang'] = chunk['KA_Lang'].str.replace(r'\s\s+', " ") 
    chunk['KA_Lang'] = chunk['KA_Lang'].str.lower() 
    print(chunk['KA_Lang'].head(1)) 

    chunk.to_sql('<SecondTable>', conn, if_exists= 'append', index= False) 

conn.close() 

Wie kann ich kontinuierlich einen Brocken aus einer SQL-Tabelle lesen und schreiben Sie es auf eine andere SQL-Tabelle? Warum stoppt die Iteration durch alle Chunks, wenn ich Folgendes einschließe: chunk.to_sql('<SecondTable>', conn, if_exists= 'append', index= False)?

Antwort

1

Nach ein paar Tagen der verschiedenen Workarounds, habe ich dieses Problem gelöst. Es ist ziemlich einfach. Für kontinuierlich ein chunk aus einer SQL-Tabelle zu lesen und es an eine anderen SQL-Tabelle zwei verschiedene Verbindungs ​​schreiben müssen definiert werden:

engine = create_engine('mssql+pymssql://<username>:<password>@<database>:1433/<FirstTable>') 
engine1 = create_engine('mssql+pymssql://<username>:<password>@<database>:1433/<FirstTable>') 
conn = engine.connect() 
conn1 = engine1.connect() 

Die Codezeile, wo chunk in der zweiten Tabelle geschrieben wird, angepasst werden muss, zu:

chunk.to_sql('<SecondTable>', conn1, if_exists= 'append', index= False) 

Fertig!