Truncate table not working with SQL server sqlalchemy engine and pandas

30,788

Solution 1

This worked for me:

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

Solution 2

I have the same problem with pandas 0.19.2 and sqlalchemy 1.1.5.

As I see autocommit is not forced in engine.execute() when running a TRUNCATE statement. If I force it manually then TRUNCATE works perfectly:

from sqlalchemy.sql import text as sa_text

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

It's fancy that DROP works perfectly without forcing autocommit...

Solution 3

Here is a full solution based from the question, using sqlalchemy 1.1.15 on Windows I was receiving errors trying to implement the other 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)

Solution 4

After trying the solution posted by ragesz and it not working for me (my sqlalchemy version is 1.3.9), I got the following to work instead:

with engine.connect() as con:
    con.execution_options(autocommit=True).execute("TRUNCATE TABLE foo;")
Share:
30,788
scottlittle
Author by

scottlittle

Data Scientist

Updated on July 13, 2022

Comments

  • scottlittle
    scottlittle almost 2 years

    I can successfully query and insert data using sqlalchemy and 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')
    

    Read tempy table:

    sql_command = """
    select top 100 * from tempy
    """
    
    df = pd.read_sql(sql_command, engine)
    print df
    
       tempID  tempValue
    0       1          2
    

    Append new data:

    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
    

    Try to truncate data:

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

    Read table again, but truncate failed:

    df = pd.read_sql(sql_command, engine)
    print df
    
       tempID  tempValue
    0       1          2
    1       4          6