Я пытаюсь подключиться к базе Oracle, выбросить данные на Pandas фрейм данных и затем отправить их на SQL Server Express localhost. Я могу подключиться к Oracle и отправить на фрейм данных, но не могу отправить на SQL Сервер. Происходит следующая ошибка, не могли бы вы мне помочь?
Эта часть работает.
import pandas as pd`enter code here`
import cx_Oracle
from sqlalchemy import create_engine
engine = create_engine('oracle://user:password@(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME = LUPA)))')
sql = """
select
substr(af.SK_COD_DATA_TRANSACAO,1,6) MesAno,
emp.nt_cod_empresa,
uneg.nt_cod_unidade_negocio Uneg,
uneg.unidade_negocio UnidadeNegocio,
l.nt_cod_estabelecimento codLocal,
l.estabelecimento Local,
cc.nt_cod_centro_custo codCCusto,
cc.centro_custo CCusto,
cc.nt_cod_plano_centro_custo,
ct.nt_cod_conta_contabil codigoConta,
ct.conta_contabil Conta,
ct.nt_cod_plano_conta_contabil,
sum(case when af.nt_cod_natureza_operacao = 'CR' then 1 else -1 end * af.val_apropriacao) apropriacao,
sum(case when af.nt_cod_natureza_operacao = 'CR' then 1 else -1 end * af.val_lancamento) lancamento
, cur.curso
, sum(case when tl.grupo_lancamento like 'Mensalidade%' and mc.fluxo_conta_corrente = 'ENT' and af.val_apropriacao <>0
then af.val_apropriacao/af.val_apropriacao else
case when tl.grupo_lancamento like 'Mensalidade%' and mc.fluxo_conta_corrente = 'SAI' and af.val_apropriacao <>0
then (af.val_apropriacao/af.val_apropriacao) *-1 end end) hc
, si.status_integracao
from dw.ft_apropriacao_financeiro af
join dw.dm_conta_contabil ct on af.sk_cod_conta_contabil = ct.sk_cod_conta_contabil
join dw.dm_centro_custo cc on af.sk_cod_centro_custo = cc.sk_cod_centro_custo
join dw.dm_unidade_negocio uneg on af.sk_cod_unidade_negocio = uneg.sk_cod_unidade_negocio
join dw.dm_estabelecimento l on af.sk_cod_estabelecimento = l.sk_cod_estabelecimento
join dw.dm_empresa emp on af.sk_cod_empresa = emp.sk_cod_empresa
join dw.dm_curso cur on cur.sk_cod_curso = af.sk_cod_curso
join dw.dm_movimento_contabil mc on af.sk_cod_movimento_contabil = mc.sk_cod_movimento_contabil
join dw.dm_status_titulo st on af.sk_cod_status_titulo = st.sk_cod_status_titulo
join dw.dm_tipo_lancamento tl on af.sk_cod_tipo_lancamento = tl.sk_cod_tipo_lancamento
join dw.dm_aluno aluno on aluno.sk_cod_aluno = af.sk_cod_aluno
join dw.dm_status_integracao si on af.sk_cod_status_integracao = si.sk_cod_status_integracao
where
af.SK_COD_DATA_TRANSACAO between '20200101' and '20200131'
and ct.nt_cod_conta_contabil in
(3110101, 3110102, 3110103, 3110104, 3110105,
3110201, 3110202,
3110301, 3110302, 3110303, 3110304, 3110310, 3110311,
3120101, 3120102, 3120103, 3120104, 3120105,
3120201, 3120102,
3120307, 3120308)
and si.status_integracao in ('Pendente','Integrado')
group by
substr(af.SK_COD_DATA_TRANSACAO,1,6) ,
emp.nt_cod_empresa,
uneg.nt_cod_unidade_negocio ,
uneg.unidade_negocio ,
l.nt_cod_estabelecimento ,
l.estabelecimento ,
cc.nt_cod_centro_custo ,
cc.centro_custo ,
cc.nt_cod_plano_centro_custo,
ct.nt_cod_conta_contabil ,
ct.conta_contabil ,
ct.nt_cod_plano_conta_contabil
, cur.curso
, si.status_integracao
"""
df = pd.read_sql(sql, engine)
Это не может работать.
import pyodbc
import pandas as result
from sqlalchemy import create_engine
engine2 = create_engine("mssql+pyodbc://localhost/Receita")
result = engine2.execute("select * from teste")
df.to_sql(con=engine2, name='RECEITA', schema='SCHEMA', index=False, if_exists='replace', chunksize=500)
Эта ошибка происходит.
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\connectors\pyodbc.py:79: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections
"No driver name specified; "
---------------------------------------------------------------------------
InterfaceError Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _wrap_pool_connect(self, fn, connection)
2274 try:
-> 2275 return fn()
2276 except dialect.dbapi.Error as e:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in connect(self)
362 if not self._use_threadlocal:
--> 363 return _ConnectionFairy._checkout(self)
364
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in _checkout(cls, pool, threadconns, fairy)
759 if not fairy:
--> 760 fairy = _ConnectionRecord.checkout(pool)
761
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in checkout(cls, pool)
491 def checkout(cls, pool):
--> 492 rec = pool._do_get()
493 try:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\impl.py in _do_get(self)
138 with util.safe_reraise():
--> 139 self._dec_overflow()
140 else:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\langhelpers.py in __exit__(self, type_, value, traceback)
67 if not self.warn_only:
---> 68 compat.reraise(exc_type, exc_value, exc_tb)
69 else:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py in reraise(tp, value, tb, cause)
152 raise value.with_traceback(tb)
--> 153 raise value
154
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\impl.py in _do_get(self)
135 try:
--> 136 return self._create_connection()
137 except:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in _create_connection(self)
307
--> 308 return _ConnectionRecord(self)
309
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in __init__(self, pool, connect)
436 if connect:
--> 437 self.__connect(first_connect_check=True)
438 self.finalize_callback = deque()
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in __connect(self, first_connect_check)
638 self.starttime = time.time()
--> 639 connection = pool._invoke_creator(self)
640 pool.logger.debug("Created new connection %r", connection)
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\strategies.py in connect(connection_record)
113 return connection
--> 114 return dialect.connect(*cargs, **cparams)
115
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py in connect(self, *cargs, **cparams)
480 def connect(self, *cargs, **cparams):
--> 481 return self.dbapi.connect(*cargs, **cparams)
482
InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Nome da fonte de dados não encontrado e nenhum driver padrão especificado (0) (SQLDriverConnect)')
The above exception was the direct cause of the following exception:
InterfaceError Traceback (most recent call last)
<ipython-input-3-4ae5388ed198> in <module>
5
6 engine2 = create_engine("mssql+pyodbc://localhost/Receita")
----> 7 result = engine2.execute("select * from teste")
8
9 df.to_sql(con=engine2, name='RECEITA', schema='SCHEMA', index=False, if_exists='replace', chunksize=500)
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py in execute(self, statement, *multiparams, **params)
2176 """
2177
-> 2178 connection = self._contextual_connect(close_with_result=True)
2179 return connection.execute(statement, *multiparams, **params)
2180
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _contextual_connect(self, close_with_result, **kwargs)
2237 return self._connection_cls(
2238 self,
-> 2239 self._wrap_pool_connect(self.pool.connect, None),
2240 close_with_result=close_with_result,
2241 **kwargs
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _wrap_pool_connect(self, fn, connection)
2277 if connection is None:
2278 Connection._handle_dbapi_exception_noconnection(
-> 2279 e, dialect, self
2280 )
2281 else:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _handle_dbapi_exception_noconnection(cls, e, dialect, engine)
1542 util.raise_from_cause(newraise, exc_info)
1543 elif should_wrap:
-> 1544 util.raise_from_cause(sqlalchemy_exception, exc_info)
1545 else:
1546 util.reraise(*exc_info)
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py in raise_from_cause(exception, exc_info)
396 exc_type, exc_value, exc_tb = exc_info
397 cause = exc_value if exc_value is not exception else None
--> 398 reraise(type(exception), exception, tb=exc_tb, cause=cause)
399
400
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py in reraise(tp, value, tb, cause)
150 value.__cause__ = cause
151 if value.__traceback__ is not tb:
--> 152 raise value.with_traceback(tb)
153 raise value
154
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py in _wrap_pool_connect(self, fn, connection)
2273 dialect = self.dialect
2274 try:
-> 2275 return fn()
2276 except dialect.dbapi.Error as e:
2277 if connection is None:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in connect(self)
361 """
362 if not self._use_threadlocal:
--> 363 return _ConnectionFairy._checkout(self)
364
365 try:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in _checkout(cls, pool, threadconns, fairy)
758 def _checkout(cls, pool, threadconns=None, fairy=None):
759 if not fairy:
--> 760 fairy = _ConnectionRecord.checkout(pool)
761
762 fairy._pool = pool
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in checkout(cls, pool)
490 @classmethod
491 def checkout(cls, pool):
--> 492 rec = pool._do_get()
493 try:
494 dbapi_connection = rec.get_connection()
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\impl.py in _do_get(self)
137 except:
138 with util.safe_reraise():
--> 139 self._dec_overflow()
140 else:
141 return self._do_get()
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\langhelpers.py in __exit__(self, type_, value, traceback)
66 self._exc_info = None # remove potential circular references
67 if not self.warn_only:
---> 68 compat.reraise(exc_type, exc_value, exc_tb)
69 else:
70 if not compat.py3k and self._exc_info and self._exc_info[1]:
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py in reraise(tp, value, tb, cause)
151 if value.__traceback__ is not tb:
152 raise value.with_traceback(tb)
--> 153 raise value
154
155 def u(s):
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\impl.py in _do_get(self)
134 if self._inc_overflow():
135 try:
--> 136 return self._create_connection()
137 except:
138 with util.safe_reraise():
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in _create_connection(self)
306 """Called by subclasses to create a new ConnectionRecord."""
307
--> 308 return _ConnectionRecord(self)
309
310 def _invalidate(self, connection, exception=None, _checkin=True):
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in __init__(self, pool, connect)
435 self.__pool = pool
436 if connect:
--> 437 self.__connect(first_connect_check=True)
438 self.finalize_callback = deque()
439
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\pool\base.py in __connect(self, first_connect_check)
637 try:
638 self.starttime = time.time()
--> 639 connection = pool._invoke_creator(self)
640 pool.logger.debug("Created new connection %r", connection)
641 self.connection = connection
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\strategies.py in connect(connection_record)
112 if connection is not None:
113 return connection
--> 114 return dialect.connect(*cargs, **cparams)
115
116 creator = pop_kwarg("creator", connect)
C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py in connect(self, *cargs, **cparams)
479
480 def connect(self, *cargs, **cparams):
--> 481 return self.dbapi.connect(*cargs, **cparams)
482
483 def create_connect_args(self, url):
InterfaceError: (pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Nome da fonte de dados não encontrado e nenhum driver padrão especificado (0) (SQLDriverConnect)')
(Background on this error at: http://sqlalche.me/e/rvf5)