web-dev-qa-db-fra.com

La table tronquée ne fonctionne pas avec le moteur SQL Server sqlalchemy et pandas

Je peux interroger et insérer des données avec succès à l'aide de sqlalchemy et de 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')

Lire la table tempy:

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

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

   tempID  tempValue
0       1          2

Ajoutez de nouvelles données:

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

Essayez pour tronquer les données:

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

Relire la table, mais tronquer a échoué:

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

   tempID  tempValue
0       1          2
1       4          6
13
scottlittle

Cela a fonctionné pour moi:

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

J'ai le même problème avec pandas 0.19.2 et sqlalchemy 1.1.5.

Comme je le vois, autocommit n'est pas forcé dans engine.execute() lors de l'exécution d'une instruction TRUNCATE. Si je le force manuellement alors TRUNCATE fonctionne parfaitement:

from sqlalchemy.sql import text as sa_text

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

Il est fantaisiste que DROP fonctionne parfaitement sans forcer autocommit...

11
ragesz

Voici une solution complète basée sur la question, en utilisant sqlalchemy 1.1.15 sur Windows, je recevais des erreurs lors de la mise en œuvre des autres solutions:

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