#python #flask
Вопрос:
Я использую flask_sqlalchemy с Oracle 19c. Все мои классы без проблем обращаются к таблице, но один конкретный, имеющий отношение, создается с двойными кавычками в Oracle.
Порядок таблиц в oracle доступен только в двойных кавычках и в нижнем регистре:
select * from "order"
все остальные таблицы в норме.
Я думаю о чем-то, связанном со строкой подключения, которая может отключить чувствительность к регистру.
Заранее большое спасибо
Вот код:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime, timedelta
from faker import Faker
from sqlalchemy import create_engine
import random
import cx_Oracle
from sqlalchemy.ext.declarative import declarative_base, declared_attr
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.declarative import declarative_base, declared_attr
db_user = 'flask_test'
db_host = 'localhost'
db_pw = 'xxxxxxxxx'
dbname = 'SGPC'
db_dsn = cx_Oracle.makedsn('{hostname}', '{port}', service_name='{service_name}')
oracle_connection_string = 'oracle cx_oracle://{username}:{password}@' db_dsn
fake = Faker()
app = Flask(__name__)
# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
app.config['SQLALCHEMY_DATABASE_URI'] = oracle_connection_string.format(
username=db_user,
password=db_pw,
hostname=db_host.split(':')[0],
port='1521',
service_name=dbname
)
app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {
"pool_size": 20,
"max_identifier_length": 128,
"case_sensitive": False,
"encoding": "UTF-8",
"coerce_to_unicode": False
}
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# db.init_app(app)
class MyMixin(object):
@declared_attr
def __tablename__(cls):
# print(cls.__name__)
return cls.__name__.lower()
Base = declarative_base()
class Customer(db.Model):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(50), nullable=False)
last_name = db.Column(db.String(50), nullable=False)
address = db.Column(db.String(500), nullable=False)
city = db.Column(db.String(50), nullable=False)
postcode = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(50), nullable=False, unique=True)
orders = db.relationship('Order', backref='customer')
order_product = db.Table('order_product',
db.Column('order_id', db.Integer, db.ForeignKey('order.id'), primary_key=True),
db.Column('product_id', db.Integer, db.ForeignKey('product.id'), primary_key=True)
)
class Order(db.Model):
# __tablename__ = 'order'
"""
__table__ = db.Table('order', Base.metadata, db.Column('id', db.Integer, primary_key=True),
db.Column('order_date', db.DateTime, nullable=False, default=datetime.utcnow),
db.Column('shipped_date', db.DateTime),
db.Column('delivered_date', db.DateTime),
db.Column('coupon_code', db.String(50)),
db.Column('customer_id', db.Integer, db.ForeignKey('customer.id'), nullable=False),
)
"""
id = db.Column(db.Integer, primary_key=True)
order_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
shipped_date = db.Column(db.DateTime)
delivered_date = db.Column(db.DateTime)
coupon_code = db.Column(db.String(50))
customer_id = db.Column(db.Integer, db.ForeignKey('customer.id'), nullable=False)
products = db.relationship('Product', secondary=order_product)
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False, unique=True)
price = db.Column(db.Integer, nullable=False)
Ответ №1:
Я считаю, что «порядок» — это проприетарное слово Oracle, поэтому SQLAlchemy заканчивает использование двойных кавычек.
Я изменил название таблицы с order на «заказы», и это решило проблему.
Может быть, это поможет другим с той же проблемой