Python 如何成功地将DataFrame插入SqlAlChemy?

Python 如何成功地将DataFrame插入SqlAlChemy?,python,sql,pandas,dataframe,sqlalchemy,Python,Sql,Pandas,Dataframe,Sqlalchemy,这是我的密码 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from datetime import datetime from sqlalchemy import MetaData, Column, Integer, String, Boolean, Enum, Float, ForeignKey, DateTime engine = create_en

这是我的密码

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
from sqlalchemy import MetaData, Column, Integer, String, Boolean, Enum, Float, ForeignKey, DateTime

engine = create_engine('sqlite:///logfilesdb.db', echo=True)
df.to_sql("logfile", con=engine, if_exists='replace', index=False, dtype={
                      "IP": Integer,
                      "date": DateTime, 
                      "time": DateTime,
                      "request_type": String(4),
                      "URL": String(50),
                      "status_code": Integer})

engine.execute("SELECT * FROM logfile").fetchall()
然而,SqlAlChemy中的datetime给了我一个问题,因为我无法成功地将它插入数据库

这是我收到的错误信息。我无法使用for循环调用SqlAlChemy中的数据

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1178 
-> 1179             context = constructor(dialect, self, conn, *args)
   1180         except BaseException as e:

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/default.py in _init_compiled(cls, dialect, connection, dbapi_connection, compiled, parameters)
    746                     if key in processors:
--> 747                         param.append(processors[key](compiled_params[key]))
    748                     else:

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/base.py in process(value)
    739                 raise TypeError(
--> 740                     "SQLite DateTime type only accepts Python "
    741                     "datetime and date objects as input."

TypeError: SQLite DateTime type only accepts Python datetime and date objects as input.


The above exception was the direct cause of the following exception:

StatementError                            Traceback (most recent call last)
<ipython-input-177-345b3630fd58> in <module>
     11                       "request_type": String(4),
     12                       "URL": String(50),
---> 13                       "status_code": Integer})
     14 
     15 engine.execute("SELECT * FROM logfile").fetchall()

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in to_sql(self, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)
   2710             chunksize=chunksize,
   2711             dtype=dtype,
-> 2712             method=method,
   2713         )
   2714 

~/opt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py in to_sql(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)
    516         chunksize=chunksize,
    517         dtype=dtype,
--> 518         method=method,
    519     )
    520 

~/opt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method)
   1318         )
   1319         table.create()
-> 1320         table.insert(chunksize, method=method)
   1321         if not name.isdigit() and not name.islower():
   1322             # check for potentially case sensitivity issues (GH7815)

~/opt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py in insert(self, chunksize, method)
    754 
    755                 chunk_iter = zip(*[arr[start_i:end_i] for arr in data_list])
--> 756                 exec_insert(conn, keys, chunk_iter)
    757 
    758     def _query_iterator(

~/opt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py in _execute_insert(self, conn, keys, data_iter)
    668         """
    669         data = [dict(zip(keys, row)) for row in data_iter]
--> 670         conn.execute(self.table.insert(), data)
    671 
    672     def _execute_insert_multi(self, conn, keys, data_iter):

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py in execute(self, object_, *multiparams, **params)
    986             raise exc.ObjectNotExecutableError(object_)
    987         else:
--> 988             return meth(self, multiparams, params)
    989 
    990     def _execute_function(self, func, multiparams, params):

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/sql/elements.py in _execute_on_connection(self, connection, multiparams, params)
    285     def _execute_on_connection(self, connection, multiparams, params):
    286         if self.supports_execution:
--> 287             return connection._execute_clauseelement(self, multiparams, params)
    288         else:
    289             raise exc.ObjectNotExecutableError(self)

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _execute_clauseelement(self, elem, multiparams, params)
   1105             distilled_params,
   1106             compiled_sql,
-> 1107             distilled_params,
   1108         )
   1109         if self._has_events or self.engine._has_events:

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1180         except BaseException as e:
   1181             self._handle_dbapi_exception(
-> 1182                 e, util.text_type(statement), parameters, None, None
   1183             )
   1184 

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _handle_dbapi_exception(self, e, statement, parameters, cursor, context)
   1471                 util.raise_from_cause(newraise, exc_info)
   1472             elif should_wrap:
-> 1473                 util.raise_from_cause(sqlalchemy_exception, exc_info)
   1474             else:
   1475                 util.reraise(*exc_info)

~/opt/anaconda3/lib/python3.7/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 

~/opt/anaconda3/lib/python3.7/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 

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1177                 conn = self._revalidate_connection()
   1178 
-> 1179             context = constructor(dialect, self, conn, *args)
   1180         except BaseException as e:
   1181             self._handle_dbapi_exception(

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/default.py in _init_compiled(cls, dialect, connection, dbapi_connection, compiled, parameters)
    745                 for key in positiontup:
    746                     if key in processors:
--> 747                         param.append(processors[key](compiled_params[key]))
    748                     else:
    749                         param.append(compiled_params[key])

~/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/base.py in process(value)
    738             else:
    739                 raise TypeError(
--> 740                     "SQLite DateTime type only accepts Python "
    741                     "datetime and date objects as input."
    742                 )

StatementError: (builtins.TypeError) SQLite DateTime type only accepts Python datetime and date objects as input.
[SQL: INSERT INTO logfile ("IP", date, time, "request type", "URL", "status code") VALUES (?, ?, ?, ?, ?, ?)]
[parameters: [{'IP': '10.128.2.1', 'date': '29/11/2017', 'time': '06:58:55', 'request type': 'GET', 'URL': 'login.php', 'status code': '200'}, {'IP': '10.128.2.1', 'date': '29/11/2017', 'time': '06:59:02', 'request type': 'POST', 'URL': 'process.php', 'status code': '302'}, {'IP': '10.128.2.1', 'date': '29/11/2017', 'time': '06:59:03', 'request type': 'GET', 'URL': 'home.php', 'status code': '200'}, {'IP': '10.131.2.1', 'date': '29/11/2017', 'time': '06:59:04', 'request type': 'GET', 'URL': 'js/vendor/moment.min.js', 'status code': '200'}, {'IP': '10.130.2.1', 'date': '29/11/2017', 'time': '06:59:06', 'request type': 'GET', 'URL': 'bootstrap-3.3.7/js/bootstrap.js', 'status code': '200'}, {'IP': '10.130.2.1', 'date': '29/11/2017', 'time': '06:59:19', 'request type': 'GET', 'URL': 'profile.php?user=bala', 'status code': '200'}, {'IP': '10.128.2.1', 'date': '29/11/2017', 'time': '06:59:19', 'request type': 'GET', 'URL': 'js/jquery.min.js', 'status code': '200'}, {'IP': '10.131.2.1', 'date': '29/11/2017', 'time': '06:59:19', 'request type': 'GET', 'URL': 'js/chart.min.js', 'status code': '200'}  ... displaying 10 of 14927 total bound parameter sets ...  {'IP': '10.130.2.1', 'date': '03/02/2018', 'time': '15:47:35', 'request type': 'GET', 'URL': 'allsubmission.php', 'status code': '200'}, {'IP': '10.130.2.1', 'date': '03/02/2018', 'time': '15:47:46', 'request type': 'GET', 'URL': 'home.php', 'status code': '200'}]]

理想的结果应该是,我可以使用query在DB中查看信息

From“SQLite没有为存储日期和/或时间而预留的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为文本、实数或整数值:文本为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”).实数为朱利安日数,根据公历,公元前4714年11月24日格林威治中午后的天数。整数为Unix时间,自1970-01-01 00:00:00 UTC以来的秒数。“或尝试使用
df['date']=pd.to_datetime(df['date'])
first在将数据帧插入SQLAlchemyar之前,我在数据帧中做了上述操作,您确定吗?为什么您尝试插入的格式像
'29/11/2017'
我使用df['date']=df['date'].dt.strftime(“%d/%m/%Y”)更改了datetime的格式。因此,我应该将日期和时间的数据类型改为整数吗?从“SQLite没有为存储日期和/或时间而预留的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为文本、实数或整数值:文本为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”).实数为朱利安日数,根据公历,公元前4714年11月24日格林威治中午后的天数。整数为Unix时间,自1970-01-01 00:00:00 UTC以来的秒数。“或尝试使用
df['date']=pd.to_datetime(df['date'])
first在将数据帧插入SQLAlchemyar之前,我在数据帧中做了上述操作,您确定吗?为什么您尝试插入的格式像
'29/11/2017'
我使用df['date']=df['date'].dt.strftime(“%d/%m/%Y”)更改了datetime的格式。那么,我是否要将日期和时间的数据类型改为整数?
**IP    date    time    request type    URL status code**
0   10.128.2.1  29/11/2017  06:58:55    GET login.php   200
1   10.128.2.1  29/11/2017  06:59:02    POST    process.php 302
2   10.128.2.1  29/11/2017  06:59:03    GET home.php    200
3   10.131.2.1  29/11/2017  06:59:04    GET js/vendor/moment.min.js 200
4   10.130.2.1  29/11/2017  06:59:06    GET bootstrap-3.3.7/js/bootstrap.js 200
5   10.130.2.1  29/11/2017  06:59:19    GET profile.php?user=bala   200
6   10.128.2.1  29/11/2017  06:59:19    GET js/jquery.min.js    200
7   10.131.2.1  29/11/2017  06:59:19    GET js/chart.min.js 200
8   10.131.2.1  29/11/2017  06:59:30    GET edit.php?name=bala  200
9   10.131.2.1  29/11/2017  06:59:37    GET logout.php  302
10  10.131.2.1  29/11/2017  06:59:37    GET login.php   200