web-dev-qa-db-ja.com

SQLサーバーのsqlalchemyエンジンとpandas

Sqlalchemyとpandasを使用して、データを正常にクエリして挿入できます。

from sqlalchemy import create_engine
import pandas as pd
engine = create_engine('mssql://myserver/mydb?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')

Tempyテーブルを読み取ります。

sql_command = """
select top 100 * from tempy
"""

df = pd.read_sql(sql_command, engine)
print df

   tempID  tempValue
0       1          2

新しいデータを追加:

df_append = pd.DataFrame( [[4,6]] , columns=['tempID','tempValue']) 
df_append.to_sql(name='tempy', con=engine, if_exists = 'append', index=False)

df = pd.read_sql(sql_command, engine)
print df

   tempID  tempValue
0       1          2
1       4          6

試してみるデータを切り捨てる:

connection = engine.connect()
connection.execute( '''TRUNCATE TABLE tempy''' )
connection.close()

テーブルを再度読み取りましたが、切り捨てに失敗しました:

df = pd.read_sql(sql_command, engine)
print df

   tempID  tempValue
0       1          2
1       4          6
13
scottlittle

これは私のために働きました:

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
session.execute('''TRUNCATE TABLE tempy''')
session.commit()
session.close()
11
scottlittle

pandas 0.19.2とsqlalchemy _1.1.5_でも同じ問題があります。

私が見るように、autocommitTRUNCATEステートメントを実行するときにengine.execute()で強制されません。手動で強制すると、TRUNCATEは完全に機能します。

_from sqlalchemy.sql import text as sa_text

engine.execute(sa_text('''TRUNCATE TABLE tempy''').execution_options(autocommit=True))
_

DROPautocommitを強制せずに完全に機能するのは空想です...

11
ragesz

これは、Windowsでsqlalchemy 1.1.15を使用した質問に基づく完全なソリューションです。他のソリューションを実装しようとするとエラーが発生しました。

import sqlalchemy
engine = sqlalchemy.create_engine('mssql://myserver/mydb?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
connection = engine.connect()
truncate_query = sqlalchemy.text("TRUNCATE TABLE tempy")
connection.execution_options(autocommit=True).execute(truncate_query)
4
Jason Ridenour