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