Description
Feature Type
-
Adding new functionality to pandas
-
Changing existing functionality in pandas
-
Removing existing functionality in pandas
Problem Description
We use the .to_sql()
method quite often in our data pipelines. As a part of our testing framework, we pass an empty string to the name param in pd.DataFrame.to_sql()
, like so:
# set up connection obj, create dataframe, etc.
...
df.to_sql(name="", con=sql_conn)
...
This returns an error, which is what you'd expect, but the error is remarkably massive and unclear:
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/pandas/core/generic.py", line 2986, in to_sql
return sql.to_sql(
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/pandas/io/sql.py", line 696, in to_sql
return pandas_sql.to_sql(
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/pandas/io/sql.py", line 1729, in to_sql
table = self.prep_table(
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/pandas/io/sql.py", line 1632, in prep_table
table.create()
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/pandas/io/sql.py", line 839, in create
self._execute_create()
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/pandas/io/sql.py", line 825, in _execute_create
self.table.create(bind=self.pd_sql.connectable)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/schema.py", line 950, in create
bind._run_ddl_visitor(ddl.SchemaGenerator, self, checkfirst=checkfirst)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2113, in _run_ddl_visitor
visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/visitors.py", line 524, in traverse_single
return meth(obj, **kw)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/ddl.py", line 890, in visit_table
self.connection.execute(
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1289, in execute
return meth(self, multiparams, params, _EMPTY_EXECUTION_OPTS)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/ddl.py", line 77, in _execute_on_connection
return connection._execute_ddl(
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1378, in _execute_ddl
compiled = ddl.compile(
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/elements.py", line 491, in compile
return self._compiler(dialect, **kw)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/ddl.py", line 29, in _compiler
return dialect.ddl_compiler(dialect, self, **kw)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/compiler.py", line 451, in __init__
self.string = self.process(self.statement, **compile_kwargs)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/compiler.py", line 486, in process
return obj._compiler_dispatch(self, **kwargs)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/visitors.py", line 82, in _compiler_dispatch
return meth(self, **kw)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/compiler.py", line 4332, in visit_create_table
text += preparer.format_table(table) + " "
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/compiler.py", line 5332, in format_table
result = self.quote(name)
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/compiler.py", line 5220, in quote
if self._requires_quotes(ident):
File "/Users/tom/opt/anaconda3/envs/hc/lib/python3.10/site-packages/sqlalchemy/sql/compiler.py", line 5129, in _requires_quotes
or value[0] in self.illegal_initial_characters
IndexError: string index out of range
Feature Description
It'd be great to add clearer error handling to the .to_sql()
method for cases like this (where name is empty by accident). I'm sure this has happened to other people, especially in testing frameworks and the like!
For example, even something very simple like this:
...
def to_sql(self, name, ...):
if not name or name == "":
raise ValueError("name parameter must be a non-empty string.")
...
could help quite a lot!
Alternative Solutions
I think this should be something that is pretty easy to handle with existing native python functionality, but I'm happy to clarify things further if people want 😄
Additional Context
No response