【问题标题】:pandas add sql table, check if table existspandas添加sql表,检查表是否存在
【发布时间】:2015-03-12 10:36:27
【问题描述】:

我有这段代码循环查找目录中的 excel 文件,将文件添加到 sqlite db 中。 如果表存在,我设法克服了引发的异常,但我发现这不优雅且效率低下,因为循环读取 excel 文件,将其添加到 Dataframe 中,等等...... 理想情况下,我希望在从 excel 创建 df 之前测试表的存在。

response = {}
for f in glob('T:\GESTION\toto\titi\tata\file_201*.xlsx'):
    print f
    datereg = re.search('T:\\\\GESTION\\\\toto\\\\titi\\\\tata\\\\file_(\d{4})(\d{2})(\d{2}).xlsx', f)
    if datereg is not None:
        dated = datetime.datetime(int(datereg.group(1)), int(datereg.group(2)), int(datereg.group(3)))
    print dated

    # ideally test if table in db exists here

    xl = pd.ExcelFile(f)
    df = xl.parse(sheetname="Sheet1")
    df = df[extractFields].drop_duplicates(subset='ISIN')
    df = df.set_index('ISIN', verify_integrity=True)
    response[dated] = df
    # print response
    engine = sqlalchemy.create_engine('sqlite:///my_db.sqlite')
    try:
        df.to_sql(dated.__str__(), engine, if_exists='fail')
    except ValueError as err:
        print(err)
        pass

【问题讨论】:

  • 为什么不在生成 dated 日期时间并在此时测试之后创建一个空的 df,这是在您读取 excel 文件然后调用 df.to_sql 之前
  • 当你说 test 时,你的意思是使用 try: except 在空的 df 上吗?
  • engine.has_table('table_name')可以检查一个表是否已经存在

标签: python excel sqlite pandas sqlalchemy


【解决方案1】:

这就是我的代码:

engine = create_engine("mysql+mysqlconnector://{user}:{pw}@localhost/{db}".format(user="root",pw="password",db="worker"))
check=engine.has_table(table_name)
            print(check) #boolean
            if check == False:
                df.to_sql(con=engine, name=table_name, if_exists='replace',index=False)

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
【解决方案2】:

从 sqlalchemy 1.4 开始,has_table 现在从 Inspector 对象调用。

查看documentation

from sqlalchemy import inspect, create_engine

engine = create_engine('...')
insp = inspect(engine)
table_exist = insp.has_table(table_name, schema)

if table_exist:
    df.to_sql(name, engine)

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 2011-07-21
    • 1970-01-01
    • 2010-09-15
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多