Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy oracle connect_Python_Oracle_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python SQLAlchemy oracle connect

Python SQLAlchemy oracle connect,python,oracle,flask,sqlalchemy,flask-sqlalchemy,Python,Oracle,Flask,Sqlalchemy,Flask Sqlalchemy,我看到的大多数连接与我正在使用的SQLAlchemy连接类型不同。我想知道是否有一种方法可以反映这种风格,或者是否必须在create_引擎中使用它。下面是我的连接示例,以及我用来连接到特定表的一个类: from flask_sqlalchemy import SQLAlchemy from flask import Flask from flask_restful import Api from flask_cors import CORS from flask_jwt_extended imp

我看到的大多数连接与我正在使用的SQLAlchemy连接类型不同。我想知道是否有一种方法可以反映这种风格,或者是否必须在create_引擎中使用它。下面是我的连接示例,以及我用来连接到特定表的一个类:

from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from flask_restful import Api
from flask_cors import CORS
from flask_jwt_extended import JWTManager
import os
from dotenv import load_dotenv
load_dotenv(verbose=True)

app = Flask(__name__)
CORS(app)
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
app.config['JWT_SECRET_KEY'] = os.getenv('SECRET_KEY')
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('SQLALCHEMY_DATABASE_URI')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['JWT_BLACKLIST_ENABLED'] = True
app.config['JWT_BLACKLIST_TOKEN_CHECKS'] = ['access', 'refresh']
db = SQLAlchemy(app)
api = Api(app)
jwt = JWTManager(app)
我的DB URI字符串如下所示:

SQLALCHEMY_DATABASE_URI="oracle+cx_oracle://username:password@db_url/dbName"
这是存储在环境变量中的,我不使用字符串格式来填充用户名、密码等的这些部分(我对它们进行了硬编码,我只是出于安全原因删除了它们)

现在,我正在尝试创建连接的类:

from App import db


class EventModel(db.Model):
    __tablename__ = 'SCHEMA_NAME.TABLE_NAME'

    RC_ID = db.Column(db.Integer, primary_key=True)
    PRODUCT_ID = db.Column(db.Integer)
    RELEASE_ID = db.Column(db.Integer)
    RCPM_ID = db.Column(db.Integer)
    FIT_DTTM = db.Column(db.String(25))
    DATACTR_ID = db.Column(db.String(10))
    COMMENT_TXT = db.Column(db.String(500))
    DESCR_TXT = db.Column(db.String(300))
    EVENTCMPLT_FLG = db.Column(db.String(1))
    EVENTCMPLTONTM_FLG = db.Column(db.String(1))
    ATTACHMENTS_FLG = db.Column(db.String(1))
    UUID = db.Column(db.Integer)
    URLS = db.Column(db.String(4000))
出于安全原因,我再次重命名了表部分

我还尝试将模式名称附加到我存储在环境变量中的DB URI。我总是会遇到这样的错误:

sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-12505: TNS:listener does not currently know of
        SID given in connect descriptor
我感谢大家的帮助。我通常与postgres一起工作,并且我正在将我的常规方法转换为使用oracle db的项目。

只需在转换为的
SQLALCHEMY\u database\u URI
字符串末尾使用数据库的

engine=db.创建引擎('oracle+cx_oracle://username:password@mydb')

其中,
mydb
被假定为
TNSNAMES.ORA
文件中,例如

mydb=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = proddb1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mycompany.com)
    )
  )

谢谢大家的帮助。我忘了发这个,我不记得在哪里找到的,但我就是这样解决这个问题的:

oracle_connection_string = 'oracle+cx_oracle://{username}:{password}@' + 
cx_Oracle.makedsn('{hostname}', '{port}', service_name='{service_name}')

app = Flask(__name__)
CORS(app)
app.config['SQLALCHEMY_DATABASE_URI'] = oracle_connection_string.format(
  username=db_user,
  password=db_pw,
  hostname=db_host.split(':')[0],
  port='1521',
  service_name=db
)

希望这会有所帮助。

架构不是连接字符串的一部分。它默认为用于连接数据库的用户名。如果你想使用另一个模式,你必须为它的对象创建同义词,或者如果你想使用env-vars,把它放在一个单独的env-var中,然后像阅读其他模式一样阅读它:getenv….@user211261218如果你不熟悉tnsnames.ora文件,关于放置它们的位置的信息就在目录中。