create_engine() 缺少1个必要的位置参数:'engine_opts

0 人关注

昨天在家里,应用程序运行良好,在 当我试图在不同的系统上运行它时,***重新安装了所有的东西。 ) - 所以我认为这个错误只适用于最新版本。

目标是在会话中把用户连接到第二个数据库。

i got this error: create_engine() missing 1 required positional argument: 'engine_opts'

My current code:

app.config['SQLALCHEMY_DATABASE_URI'] = "postgres:// ****" #main database
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = "True"
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = "None" #i didnt have that line in my system 
before i've just added it in attempt of fixing this issue
db = SQLAlchemy(app,session_options={"autoflush": False})
@app.route('/test')
def test():
    x = 'postgres://*****' #secondary database for user in session only.
    engine = db.create_engine(x)
return ''

Things I've tried :

检查图书馆页面 : flask_SQLAlchemy库

我发现关于它的所有信息是这样的。

创建_引擎(sa_url, engine_opts)覆盖此方法,以最终 对SQLAlchemy引擎的创建方式有最终决定权。

在大多数情况下,你会希望使用'SQLALCHEMY_ENGINE_OPTIONS'配置变量 变量或为SQLAlchemy()设置引擎_选项。

我在网上搜索了一些例子,但都没有成功。

第01次尝试:

db.create_engine(DB_URL,**engine_opts)

Output:

NameError: name 'engine_opts' is not defined

第02次尝试:

db.create_engine(DB_URL,**db.engine_opts)

Output:

AttributeError: 'SQLAlchemy' 对象没有'engine_opts'属性

第03次尝试:

db.create_engine(DB_URL,engine_opts='None')

Output:

TypeError: 创建_引擎() argument after ** must be a mapping, not str

第04次尝试:

db.create_engine(DB_URL,engine_opts=None)

TypeError: 创建_引擎() argument after ** must be a mapping, not NoneType

第05次尝试:

db.create_engine(xDB,db.engine_opts='None')

系统崩溃"didnt even run" :

SyntaxError: 关键字不能是表达式

第06次尝试:

db.create_engine(xDB,{'SQLALCHEMY_ENGINE_OPTIONS': None})

Output:

 return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\project1\app.py", line 175, in test
    engine = db.create_engine(xDB,{'SQLALCHEMY_ENGINE_OPTIONS': None})
  File "C:\Users\Rick\AppData\Local\Programs\Python\Python37\lib\site-packages\flask_sqlalchemy\__init__.py", line 966, in create_engine
    return sqlalchemy.create_engine(sa_url, **engine_opts)
  File "C:\Users\Rick\AppData\Local\Programs\Python\Python37\lib\site-packages\sqlalchemy\engine\__init__.py", line 435, in create_engine
    return strategy.create(*args, **kwargs)
  File "C:\Users\Rick\AppData\Local\Programs\Python\Python37\lib\site-packages\sqlalchemy\engine\strategies.py", line 87, in create
    dbapi = dialect_cls.dbapi(**dbapi_args)
  File "C:\Users\Rick\AppData\Local\Programs\Python\Python37\lib\site-packages\sqlalchemy\dialects\postgresql\psycopg2.py", line 632, in dbapi
    import psycopg2
ModuleNotFoundError: No module named 'psycopg2'

第07次尝试:

基于#Attempt06的psycopg2安装后

db.create_engine(xDB,{'SQLALCHEMY_ENGINE_OPTIONS': None})

Output:

TypeError: Invalid argument(s) 'SQLALCHEMY_ENGINE_OPTIONS' sent to create_engine(), using configuration PGDialect_psycopg2/QueuePool/Engine.  Please check that the keyword arguments are appropriate for this combination of components.
    
5 个评论
替换代码0】不应该是一个字符串,它是一个Python对象,所以不要引用它。
@roganjosh TypeError: create_engine() argument after ** must be a mapping, not NoneType
@AbdulNiyasPM 我刚刚添加了它,请参考尝试#06 ` import psycopg2 ModuleNotFoundError:没有名为'psycopg2'的模块`。
@AnttiHaapala 我对你的理性决定非常失望,我有两台笔记本电脑紧挨着(都是windows 10),我把应用程序放在闪存盘里,以确保在它们两个上运行完全相同的代码,我个人的笔记本电脑运行代码很好,其他的则出现了关于 "引擎_选项 "的错误,我从未想过像你这样受人尊敬的人对情况的判断会那么快...感谢你的意见。
@AnttiHaapala 是的,你确实提到了,但你从来没有解释过原因,据我所知,flask_sqlAlchemy只是SQLAlchemy的一个封装器,无论如何,我已经检查了两台笔记本电脑的版本(((不工作的那些)))。Flask_SQLAlchemy (2.4.0) / SQLAlchemy (1.3.3) , (((((( 工作的笔记本 ))))))Flask-SQLAlchemy(2.3.2) / SQLAlchemy(1.2.11) .... 我还应该提到,在那台笔记本上我有大约两列库,可能是 "Anaconda "的一部分或其他我在不同项目上使用的库。
python
python-3.x
flask
sqlalchemy
flask-sqlalchemy
LoopingDev
LoopingDev
发布于 2019-05-19
2 个回答
LoopingDev
LoopingDev
发布于 2021-02-01
已采纳
0 人赞同

in conclusion :

db.create_engine(DB_URL,{}) worked for me.

解释一下原因。

我自己的电脑上的 flask_SQLAlchemy 的版本是 2.3.2

新安装的版本是 2.4.0

其中有这个功能,你可以在那里读到它。 flask_SQLAlchemy - 更改 版本2.4.0

  • Make engine configuration more flexible ( #684 )
  • 这已经改变了我们创造新引擎的方式。 之前 db.create_engine(DB_URL) 已经足够了

    JiangKui
    JiangKui
    发布于 2021-02-01
    0 人赞同

    我遇到了同样的问题。然后我把它修好了。

    from SQLAlchemy import create_engine
    engine = create_engine(URI)