截断表不使用SQL Server sqlalchemy引擎和pandas

sco*_*tle 12 python sql-server 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')
Run Code Online (Sandbox Code Playgroud)

阅读临时表:

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

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

   tempID  tempValue
0       1          2
Run Code Online (Sandbox Code Playgroud)

附加新数据:

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
Run Code Online (Sandbox Code Playgroud)

尝试截断数据:

connection = engine.connect()
connection.execute( '''TRUNCATE TABLE tempy''' )
connection.close()
Run Code Online (Sandbox Code Playgroud)

再次读表,但截断失败:

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

   tempID  tempValue
0       1          2
1       4          6
Run Code Online (Sandbox Code Playgroud)

rag*_*esz 15

我对pandas0.19.2和sqlalchemy 有同样的问题1.1.5.

正如我所看到autocommit的那样,engine.execute()在运行TRUNCATE声明时并没有强制进入.如果我手动强制它然后TRUNCATE完美地工作:

from sqlalchemy.sql import text as sa_text

engine.execute(sa_text('''TRUNCATE TABLE tempy''').execution_options(autocommit=True))
Run Code Online (Sandbox Code Playgroud)

它的幻想是DROP完美的,没有强迫autocommit......

  • 谢谢!`autocommit` 是关键。 (2认同)

sco*_*tle 11

这对我有用:

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


小智 6

这是基于该问题的完整解决方案,在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)
Run Code Online (Sandbox Code Playgroud)


Cod*_*ers 6

在尝试了 ragesz 发布的解决方案但它对我不起作用(我的 sqlalchemy 版本是1.3.9)后,我得到了以下工作:

with engine.connect() as con:
    con.execution_options(autocommit=True).execute("TRUNCATE TABLE foo;")
Run Code Online (Sandbox Code Playgroud)