Python SQLAlchemy oracle connect
我看到的大多数连接与我正在使用的SQLAlchemy连接类型不同。我想知道是否有一种方法可以反映这种风格,或者是否必须在create_引擎中使用它。下面是我的连接示例,以及我用来连接到特定表的一个类: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
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文件,关于放置它们的位置的信息就在目录中。