Python中pandas.to_sql()如何将传入DataFrame变量名设为SQL表名
错误原因
你之前的table_name = 'df'.format(df)写法不生效,是因为字符串'df'没有设置占位符,且df本身是DataFrame实例对象,不会存储它被赋值的变量名,无法直接从对象本身读取变量名。
实现方案
借助Python标准库inspect模块读取调用栈信息,提取调用函数时传入的变量名作为表名,修改后的完整代码如下:
import urllib import sqlalchemy import inspect def write_to_sql(df): # 提取调用时传入的变量名 call_stack = inspect.stack() call_code = call_stack[1].code_context[0].strip() table_name = call_code.split('(')[1].split(')')[0].strip() # 请补全下方DRIVER、SERVER、DATABASE的实际配置值 params = urllib.parse.quote_plus(r'DRIVER={ODBC Driver 17 for SQL Server};SERVER={你的数据库实例地址};DATABASE={你的数据库名称};Trusted_connection=yes;') conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params) engine = sqlalchemy.create_engine(conn_str) df.to_sql(name=table_name, con=engine, schema='yep', if_exists='replace', index=True, index_label=None, chunksize=10, dtype=None) # 调用时传入变量my_test_table,自动生成的表名即为my_test_table write_to_sql(my_test_table)
可选优化
如果需要兼顾自动提取和手动指定表名的场景,可以新增可选参数做兼容,稳定性更高:
def write_to_sql(df, table_name=None): if table_name is None: # 自动提取变量名逻辑 call_stack = inspect.stack() call_code = call_stack[1].code_context[0].strip() table_name = call_code.split('(')[1].split(')')[0].strip() # 后续连接、写入逻辑不变 params = urllib.parse.quote_plus(r'DRIVER={ODBC Driver 17 for SQL Server};SERVER={你的数据库实例地址};DATABASE={你的数据库名称};Trusted_connection=yes;') conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params) engine = sqlalchemy.create_engine(conn_str) df.to_sql(name=table_name, con=engine, schema='yep', if_exists='replace', index=True, index_label=None, chunksize=10, dtype=None) # 两种调用方式都支持 write_to_sql(my_test_table) # 自动使用变量名作为表名 write_to_sql(my_test_table, table_name="custom_table") # 手动指定表名
注意事项
如果调用函数时传入的不是直接的变量(比如write_to_sql(df.copy())、write_to_sql(pd.DataFrame({'a':[1,2]}))这类表达式),自动提取的表名会不符合预期,这类场景建议手动指定table_name参数。
内容的提问来源于stack exchange,提问作者papelr
相关产品推荐
相关产品推荐

