Python SQL炼金术表不存在
我在Dash应用程序上写东西,并使用SQL alchemy对数据库进行处理。我想使数据库的创建自动化,因此如果数据库不存在,我有几行代码来创建数据库Python SQL炼金术表不存在,python,pandas,sqlalchemy,plotly-dash,Python,Pandas,Sqlalchemy,Plotly Dash,我在Dash应用程序上写东西,并使用SQL alchemy对数据库进行处理。我想使数据库的创建自动化,因此如果数据库不存在,我有几行代码来创建数据库 from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, Float from sqlalchemy_utils import create_database, database_exists engine = create_engine(SQL
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, Float
from sqlalchemy_utils import create_database, database_exists
engine = create_engine(SQLALCHEMY_DATABASE_URI, echo = True)
create_database(SQLALCHEMY_DATABASE_URI)
meta = MetaData()
flagged_vendors_table = Table(
'flagged_vendors', meta,
Column(vendor_col, String, primary_key = True),
Column(flag_col, Integer)
)
meta.create_all(engine)
根据echo,这似乎工作得很好:
2020-01-21 09:28:30,604 INFO sqlalchemy.engine.base.Engine
CREATE TABLE flagged_vendors (
"Vendor PRS_description" VARCHAR NOT NULL,
"Flag" INTEGER,
PRIMARY KEY ("Vendor PRS_description")
)
2020-01-21 09:28:30,608 INFO sqlalchemy.engine.base.Engine ()
2020-01-21 09:28:30,639 INFO sqlalchemy.engine.base.Engine COMMIT
但是,当我执行该应用程序时,会出现以下错误:
Traceback (most recent call last):
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1246, in _execute_context
cursor, statement, parameters, context
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute
cursor.execute(statement, parameters)
sqlite3.OperationalError: no such table: flagged_vendors
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\pandas\io\sql.py", line 518, in to_sql
method=method,
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\pandas\io\sql.py", line 1319, in to_sql
table.create()
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\pandas\io\sql.py", line 647, in create
self.pd_sql.drop_table(self.name, self.schema)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\pandas\io\sql.py", line 1367, in drop_table
self.get_table(table_name, schema).drop()
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\sql\schema.py", line 884, in drop
bind._run_visitor(ddl.SchemaDropper, self, checkfirst=checkfirst)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\base.py", line 2049, in _run_visitor
conn._run_visitor(visitorcallable, element, **kwargs)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1618, in _run_visitor
visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\sql\visitors.py", line 138, in traverse_single
return meth(obj, **kw)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\sql\ddl.py", line 1002, in visit_table
self.connection.execute(DropTable(table))
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\base.py", line 982, in execute
return meth(self, multiparams, params)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\sql\ddl.py", line 72, in _execute_on_connection
return connection._execute_ddl(self, multiparams, params)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1044, in _execute_ddl
compiled,
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1250, in _execute_context
e, statement, parameters, cursor, context
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1476, in _handle_dbapi_exception
util.raise_from_cause(sqlalchemy_exception, exc_info)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\util\compat.py", line 398, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\util\compat.py", line 152, in reraise
raise value.with_traceback(tb)
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1246, in _execute_context
cursor, statement, parameters, context
File "C:\Users\LIAG8802\Documents\Procurement_analytics\venv\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: flagged_vendors
[SQL:
DROP TABLE flagged_vendors]
(Background on this error at: http://sqlalche.me/e/e3q8)
回溯不会导致代码中出现任何行,这是我试图调查的问题,但我相信代码中只有一部分可能导致错误:
def to_storage(df, storage_info):
storage_type = storage_info["storage_type"]
if storage_type == "sql":
db_uri = storage_info["db_uri"]
engine = create_engine(db_uri, echo = False, pool_pre_ping=True)
table_name = storage_info["table_name"]
df.to_sql(table_name, engine, if_exists = "replace")
这很奇怪,因为代码应该只在表存在时才删除它。最后一个元素:只有在我启动应用程序时指定的URI中没有现有数据库时,才会出现此问题。@IljaEverilä它们是相同的,并且包含一个相对值path@IljaEverilä它们是相同的,并且包含一个相对路径