ModuleNotFoundError:没有使用 Pyodide 命名为"psycopg2"的模块



我只将此代码添加到此存储库的*ts文件中(https://github.com/ibdafna/webdash)它在我的conda环境中运行良好。

from sqlalchemy.engine.create import create_engine
import pandas as pd
from datetime import datetime
url = 'postgresql://mmnikx ....'
engine =create_engine(url)
now = datetime.now()
df=pd.DataFrame([now])
df.to_sql(
"TestDBTime",  # table name
con=engine,
if_exists='append',
index=False
)

我正在尝试使用sqlalchemy连接到数据库。这段代码在一个typescript文件中。在html文件中运行带有pyodide的dash。我认为问题是我无法加载psycopg2,因为它不是一个纯python包,而sqlalchemy的pyodide版本也没有这个包。

我该如何避免这个问题?我的主要问题是获取信息。连接到数据库似乎是最好的选择。我试着安装pygsheet,但没有成功。

Uncaught (in promise) PythonError: Traceback (most recent call last):
File "/lib/python3.9/site-packages/_pyodide/_base.py", line 415, in eval_code
CodeRunner(
File "/lib/python3.9/site-packages/_pyodide/_base.py", line 296, in run
coroutine = eval(self.code, globals, locals)
File "<exec>", line 19, in <module>
File "<string>", line 2, in create_engine
File "/lib/python3.9/site-packages/sqlalchemy/util/deprecations.py", line 309, in warned
return fn(*args, **kwargs)
File "/lib/python3.9/site-packages/sqlalchemy/engine/create.py", line 560, in create_engine
dbapi = dialect_cls.dbapi(**dbapi_args)
File "/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py", line 782, in dbapi
import psycopg2
ModuleNotFoundError: No module named 'psycopg2'
at new_error (pyodide.asm.js:14:246344)
at pyodide.asm.wasm:0xe6e27
at pyodide.asm.wasm:0xe6f25
at Object.Module._pythonexc2js (pyodide.asm.js:14:943337)
at Object.Module.callPyObjectKwargs (pyproxy.gen.ts:409:12)
at Object.Module.callPyObject (pyproxy.gen.ts:415:17)
at PyProxyClass.apply (pyproxy.gen.ts:1191:19)
at Object.apply (pyproxy.gen.ts:1064:18)
at Object.runPython (api.ts:57:25)
at r (worker.js:62:35)

Pyodide或任何在web浏览器中运行的程序都不支持TCP/IP连接。您需要TCP/IP连接才能连接到远程PostgreSQL数据库。psycopg2或任何其他正常的SQL数据库驱动程序都不能与Pyodide一起工作。

Web浏览器无法进行TCP/IP连接,因为这将是一场安全噩梦,因为它们可以连接到本地网络中的任何应用程序。

SQLAlchemy需要一个驱动程序库来连接到特定的数据库。

可以在连接字符串中指定要在其中使用的库,因此不一定需要使用PostgreSQL的默认驱动程序psycopg2

例如,您可以让postgresql+asyncpg://user:pass@host:port/db使用asyncpg

这可能不是一个好的替代方案(除非想要异步代码(。这里提供了SQLAlchemy支持的PostgreSQL数据库驱动程序库的完整列表。也许其中一个会起作用?

或者,您可以尝试安装psycopg2-binary软件包,考虑到psycopg2的后续版本可能有多麻烦,我经常使用它!但是,请注意,官方并不建议将其用于生产。

最后,听起来你真的不在乎数据是否存储在postgres数据库中?如果数据足够轻,您可以选择查看电子表格,为什么不考虑使用SQLite数据库呢?然后,数据库就是应用程序可以访问的一个文件。您可以获得开箱即用的sqlalchemy支持,切换就像将连接字符串更改为sqlite:///path/to/my.db一样简单(其中my.db是您将创建的SQLite数据库文件(。

我在这里创建了一个精简的例子,如果你对这个选项感兴趣,它与我认为你正在尝试做的非常相似

最新更新