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
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()
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
...
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)