flask_sqlalchemy с Oracle создает одну таблицу со строчными буквами

#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 на «заказы», и это решило проблему.

Может быть, это поможет другим с той же проблемой