I don't get why the table is getting created in the first place. A table 
with this name exists, and the option "if_exists='append'" should append 
the dataframe to the existing table.
There should not be a dropping of the table (which I have not seen) nor 
creation of the table.

And in case of creating the table, I think it should be possible to define 
the length of the field, so varchar([variable_to_be_submitted]).
In my case I expect this particular table to grow to several hundred 
million rows, so assigned storage space is a factor.

the existing table was created like this:

CREATE TABLE dbo.DSI
(
a datetime
b varchar(10) null,
c varchar(100) null,
d varchar(10) null,
e varchar(100) null,
f decimal (8,6) null,
g decimal (8,6) null
)
 
If I read and understand the error stack correct, the cause is the create 
table statement, which I would very strongly hope to cause an error, as the 
table exists.
Should the create table statement not be omitted if the option 
"if_exists='append'" option is set?

On Wednesday, September 13, 2017 at 11:15:27 AM UTC-7, Mike Bayer wrote:
>
> OK so....don't use VARCHAR(max)?  What datatype would you like?  We 
> have most of them and you can make new ones too. 
>
> On Wed, Sep 13, 2017 at 1:07 PM, dirk.biesinger 
> <dirk.bi...@gmail.com <javascript:>> wrote: 
> > Mike, 
> > 
> > here's the error stack (I had to mask some details): 
> > The columns (dataformats) in the create table statement are wrong. Also, 
> > this table does not have an index. 
> > 
> > 2017-09-13 15:07:50,200 INFO sqlalchemy.engine.base.Engine SELECT 
> > SERVERPROPERTY('ProductVersion') 
> > 2017-09-13 15:07:50,202 INFO sqlalchemy.engine.base.Engine () 
> > 2017-09-13 15:07:50,246 INFO sqlalchemy.engine.base.Engine SELECT 
> > schema_name() 
> > 2017-09-13 15:07:50,247 INFO sqlalchemy.engine.base.Engine () 
> > 2017-09-13 15:07:50,522 INFO sqlalchemy.engine.base.Engine SELECT 
> CAST('test 
> > plain returns' AS VARCHAR(60)) AS anon_1 
> > 2017-09-13 15:07:50,522 INFO sqlalchemy.engine.base.Engine () 
> > 2017-09-13 15:07:50,562 INFO sqlalchemy.engine.base.Engine SELECT 
> CAST('test 
> > unicode returns' AS NVARCHAR(60)) AS anon_1 
> > 2017-09-13 15:07:50,563 INFO sqlalchemy.engine.base.Engine () 
> > 2017-09-13 15:07:50,604 INFO sqlalchemy.engine.base.Engine SELECT 
> > [INFORMATION_SCHEMA].[COLUMNS].[TABLE_SCHEMA], 
> > [INFORMATION_SCHEMA].[COLUMNS].[TABLE_NAME], 
> > [INFORMATION_SCHEMA].[COLUMNS].[COLUMN_NAME], 
> > [INFORMATION_SCHEMA].[COLUMNS].[IS_NULLABLE], 
> > [INFORMATION_SCHEMA].[COLUMNS].[DATA_TYPE], 
> > [INFORMATION_SCHEMA].[COLUMNS].[ORDINAL_POSITION], 
> > [INFORMATION_SCHEMA].[COLUMNS].[CHARACTER_MAXIMUM_LENGTH], 
> > [INFORMATION_SCHEMA].[COLUMNS].[NUMERIC_PRECISION], 
> > [INFORMATION_SCHEMA].[COLUMNS].[NUMERIC_SCALE], 
> > [INFORMATION_SCHEMA].[COLUMNS].[COLUMN_DEFAULT], 
> > [INFORMATION_SCHEMA].[COLUMNS].[COLLATION_NAME] 
> > FROM [INFORMATION_SCHEMA].[COLUMNS] 
> > WHERE [INFORMATION_SCHEMA].[COLUMNS].[TABLE_NAME] = CAST(? AS 
> NVARCHAR(max)) 
> > AND [INFORMATION_SCHEMA].[COLUMNS].[TABLE_SCHEMA] = CAST(? AS 
> NVARCHAR(max)) 
> > 2017-09-13 15:07:50,605 INFO sqlalchemy.engine.base.Engine 
> ('dbo.MSODS_DSI', 
> > 'dbo') 
> > 2017-09-13 15:07:52,151 INFO sqlalchemy.engine.base.Engine 
> > CREATE TABLE [dbo.MSODS_DSI] ( 
> > [a] DATETIME NULL, 
> > [b] VARCHAR(max) NULL, 
> > [c] VARCHAR(max) NULL, 
> > [d] VARCHAR(max) NULL, 
> > [e] VARCHAR(max) NULL, 
> > [f] FLOAT(53) NULL, 
> > [g] FLOAT(53) NULL 
> > ) 
> > 
> > 
> > 2017-09-13 15:07:52,152 INFO sqlalchemy.engine.base.Engine () 
> > 2017-09-13 15:07:54,374 INFO sqlalchemy.engine.base.Engine ROLLBACK 
> > 
> --------------------------------------------------------------------------- 
> > ProgrammingError                          Traceback (most recent call 
> last) 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py 
>
> > in _execute_context(self, dialect, constructor, statement, parameters, 
> > *args) 
> >    1181                         parameters, 
> > -> 1182                         context) 
> >    1183         except BaseException as e: 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/default.py
>  
>
> > in do_execute(self, cursor, statement, parameters, context) 
> >     469     def do_execute(self, cursor, statement, parameters, 
> > context=None): 
> > --> 470         cursor.execute(statement, parameters) 
> >     471 
> > 
> > ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL 
> > Server][SQL Server]The statement failed. Column 'b' has a data type that 
> > cannot participate in a columnstore index.\r\nOperation cancelled by 
> user. 
> > (35343) (SQLExecDirectW)") 
> > 
> > The above exception was the direct cause of the following exception: 
> > 
> > ProgrammingError                          Traceback (most recent call 
> last) 
> > <ipython-input-16-290e9c1020c9> in <module>() 
> >      17 #cnxn = pyodbc.connect(connection_str) 
> >      18 #engn.connect() 
> > ---> 19 df.to_sql(tbl_server_out, engn, if_exists='append', index=False) 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py 
> > in to_sql(self, name, con, flavor, schema, if_exists, index, 
> index_label, 
> > chunksize, dtype) 
> >    1343         sql.to_sql(self, name, con, flavor=flavor, 
> schema=schema, 
> >    1344                    if_exists=if_exists, index=index, 
> > index_label=index_label, 
> > -> 1345                    chunksize=chunksize, dtype=dtype) 
> >    1346 
> >    1347     def to_pickle(self, path, compression='infer'): 
> > 
> > /home/saravji/anaconda3/lib/python3.6/site-packages/pandas/io/sql.py in 
> > to_sql(frame, name, con, flavor, schema, if_exists, index, index_label, 
> > chunksize, dtype) 
> >     469     pandas_sql.to_sql(frame, name, if_exists=if_exists, 
> index=index, 
> >     470                       index_label=index_label, schema=schema, 
> > --> 471                       chunksize=chunksize, dtype=dtype) 
> >     472 
> >     473 
> > 
> > /home/saravji/anaconda3/lib/python3.6/site-packages/pandas/io/sql.py in 
> > to_sql(self, frame, name, if_exists, index, index_label, schema, 
> chunksize, 
> > dtype) 
> >    1148                          if_exists=if_exists, 
> > index_label=index_label, 
> >    1149                          schema=schema, dtype=dtype) 
> > -> 1150         table.create() 
> >    1151         table.insert(chunksize) 
> >    1152         if (not name.isdigit() and not name.islower()): 
> > 
> > /home/saravji/anaconda3/lib/python3.6/site-packages/pandas/io/sql.py in 
> > create(self) 
> >     596                     "'{0}' is not valid for 
> > if_exists".format(self.if_exists)) 
> >     597         else: 
> > --> 598             self._execute_create() 
> >     599 
> >     600     def insert_statement(self): 
> > 
> > /home/saravji/anaconda3/lib/python3.6/site-packages/pandas/io/sql.py in 
> > _execute_create(self) 
> >     581         # Inserting table into database, add to MetaData object 
> >     582         self.table = self.table.tometadata(self.pd_sql.meta) 
> > --> 583         self.table.create() 
> >     584 
> >     585     def create(self): 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/schema.py 
>
> > in create(self, bind, checkfirst) 
> >     754         bind._run_visitor(ddl.SchemaGenerator, 
> >     755                           self, 
> > --> 756                           checkfirst=checkfirst) 
> >     757 
> >     758     def drop(self, bind=None, checkfirst=False): 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py 
>
> > in _run_visitor(self, visitorcallable, element, connection, **kwargs) 
> >    1927                      connection=None, **kwargs): 
> >    1928         with self._optional_conn_ctx_manager(connection) as 
> conn: 
> > -> 1929             conn._run_visitor(visitorcallable, element, 
> **kwargs) 
> >    1930 
> >    1931     class _trans_ctx(object): 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py 
>
> > in _run_visitor(self, visitorcallable, element, **kwargs) 
> >    1536     def _run_visitor(self, visitorcallable, element, **kwargs): 
> >    1537         visitorcallable(self.dialect, self, 
> > -> 1538                         **kwargs).traverse_single(element) 
> >    1539 
> >    1540 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/visitors.py
>  
>
> > in traverse_single(self, obj, **kw) 
> >     119             meth = getattr(v, "visit_%s" % obj.__visit_name__, 
> None) 
> >     120             if meth: 
> > --> 121                 return meth(obj, **kw) 
> >     122 
> >     123     def iterate(self, obj): 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/ddl.py 
> in 
> > visit_table(self, table, create_ok, include_foreign_key_constraints, 
> > _is_metadata_operation) 
> >     765             CreateTable( 
> >     766                 table, 
> > --> 767 
> > include_foreign_key_constraints=include_foreign_key_constraints 
> >     768             )) 
> >     769 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py 
>
> > in execute(self, object, *multiparams, **params) 
> >     943             raise exc.ObjectNotExecutableError(object) 
> >     944         else: 
> > --> 945             return meth(self, multiparams, params) 
> >     946 
> >     947     def _execute_function(self, func, multiparams, params): 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/ddl.py 
> in 
> > _execute_on_connection(self, connection, multiparams, params) 
> >      66 
> >      67     def _execute_on_connection(self, connection, multiparams, 
> > params): 
> > ---> 68         return connection._execute_ddl(self, multiparams, 
> params) 
> >      69 
> >      70     def execute(self, bind=None, target=None): 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py 
>
> > in _execute_ddl(self, ddl, multiparams, params) 
> >    1000             compiled, 
> >    1001             None, 
> > -> 1002             compiled 
> >    1003         ) 
> >    1004         if self._has_events or self.engine._has_events: 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py 
>
> > in _execute_context(self, dialect, constructor, statement, parameters, 
> > *args) 
> >    1187                 parameters, 
> >    1188                 cursor, 
> > -> 1189                 context) 
> >    1190 
> >    1191         if self._has_events or self.engine._has_events: 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py 
>
> > in _handle_dbapi_exception(self, e, statement, parameters, cursor, 
> context) 
> >    1400                 util.raise_from_cause( 
> >    1401                     sqlalchemy_exception, 
> > -> 1402                     exc_info 
> >    1403                 ) 
> >    1404             else: 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/util/compat.py 
>
> > in raise_from_cause(exception, exc_info) 
> >     201     exc_type, exc_value, exc_tb = exc_info 
> >     202     cause = exc_value if exc_value is not exception else None 
> > --> 203     reraise(type(exception), exception, tb=exc_tb, cause=cause) 
> >     204 
> >     205 if py3k: 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/util/compat.py 
>
> > in reraise(tp, value, tb, cause) 
> >     184             value.__cause__ = cause 
> >     185         if value.__traceback__ is not tb: 
> > --> 186             raise value.with_traceback(tb) 
> >     187         raise value 
> >     188 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py 
>
> > in _execute_context(self, dialect, constructor, statement, parameters, 
> > *args) 
> >    1180                         statement, 
> >    1181                         parameters, 
> > -> 1182                         context) 
> >    1183         except BaseException as e: 
> >    1184             self._handle_dbapi_exception( 
> > 
> > 
> /home/saravji/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/default.py
>  
>
> > in do_execute(self, cursor, statement, parameters, context) 
> >     468 
> >     469     def do_execute(self, cursor, statement, parameters, 
> > context=None): 
> > --> 470         cursor.execute(statement, parameters) 
> >     471 
> >     472     def do_execute_no_params(self, cursor, statement, 
> context=None): 
> > 
> > ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] 
> > [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The statement 
> failed. 
> > Column 'b' has a data type that cannot participate in a columnstore 
> > index.\r\nOperation cancelled by user. (35343) (SQLExecDirectW)") [SQL: 
> > '\nCREATE TABLE [dbo.MSODS_DSI] (\n\t[a] DATETIME NULL, \n\t[b] 
> VARCHAR(max) 
> > NULL, \n\t[c] VARCHAR(max) NULL, \n\t[d] VARCHAR(max) NULL, \n\t[e] 
> > VARCHAR(max) NULL, \n\t[f] FLOAT(53) NULL, \n\t[g] FLOAT(53) 
> NULL\n)\n\n'] 
> > 
> > 
> > 
> > On Monday, September 11, 2017 at 3:34:47 PM UTC-7, dirk.biesinger wrote: 
> >> 
> >> I am encountering errors when trying to use the pd.to_sql function to 
> >> write a dataframe to MS SQL Data Warehouse. 
> >> The connection works when NOT using sqlalchemy engines. 
> >> I can read dataframes as well as row-by-row via select statements when 
> I 
> >> use pyodbc connections 
> >> I can write data via insert statements (as well as delete data) when 
> using 
> >> pyodbc. 
> >> However, when I try to connect using a sqlalchemy engine I run into a 
> >> string of error messages starting with: 
> >> 
> >> ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] 
> >> [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Catalog view 
> >> 'dm_exec_sessions' is not supported in this version. (104385) 
> >> (SQLExecDirectW)") 
> >> 
> >> 
> >> I have searched online, and this exact error seems to have been 
> reported / 
> >> evaluated in May of this year as issue #3994: 
> >> 
> >> 
> >> 
> >> 
> https://bitbucket.org/zzzeek/sqlalchemy/issues/3994/azure-sql-datawarehouse-basic
>  
> >> 
> >> 
> >> I could not find a solution to this, and I'd really dislike to do a 
> >> line-wise or blob insert statement (I'm working with multiple datasets 
> that 
> >> each has a few million rows, so execution time is a consideration, 
> although 
> >> the result sets I'm getting are more like in the 100k lines area each.) 
> >> 
> >> 
> >> I get the same error messages even when I replace the pd.to_sql command 
> >> with a simple engine.connect() 
> >> 
> >> 
> >> Enclosed my installed packages (packages.list) 
> >> 
> >> Enclosed the full traceback (traceback.txt) 
> >> 
> >> 
> >> This is the code I'm using: 
> >> 
> >> connection_string = 
> >> "mssql+pyodbc://<username>:<password>@<sqlhost>.database.windows.net:<port>/<database>?driver=ODBC+Driver+13+for+SQL+Server"
> >>  
>
> >> engn = sqlalchemy.engine.create_engine(connection_string, echo=True) 
> >> engn.connect() 
> >> 
> >> 
> >> I'm very well aware that MS SQL DataWarehouse behaves a bit different, 
> so 
> >> I'm open for some experimenting to get this issue narrowed down. 
> >> 
> >> In case it matters: I'm running an ubuntu 16.04 VM on azure with 
> jupyter 
> >> notebook server and python 3.6.1. 
> >> 
> >> Best, 
> >> 
> >> DB 
> > 
> > -- 
> > SQLAlchemy - 
> > The Python SQL Toolkit and Object Relational Mapper 
> > 
> > http://www.sqlalchemy.org/ 
> > 
> > To post example code, please provide an MCVE: Minimal, Complete, and 
> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> > description. 
> > --- 
> > You received this message because you are subscribed to the Google 
> Groups 
> > "sqlalchemy" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an 
> > email to sqlalchemy+...@googlegroups.com <javascript:>. 
> > To post to this group, send email to sqlal...@googlegroups.com 
> <javascript:>. 
> > Visit this group at https://groups.google.com/group/sqlalchemy. 
> > For more options, visit https://groups.google.com/d/optout. 
>

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to