Sqlalchemy + Firebird:如何删除引号

Sqlalchemy + Firebird: How to remove quotation marks

我是 SqlAlchemy 和 Firebird DB 的新手。

我可以使用 DBeaver 直接创建 table:

CREATE TABLE NEWTABLE (
    COLUMN1 FLOAT,
    COLUMN2 FLOAT
);

但是如果我尝试使用 pyndas+sqlalchemy 做同样的事情,我会得到一个错误:

import sqlalchemy as sa
import pandas as pd


engine = sa.create_engine(r'firebird+fdb://user:pwd@localhost:3050/c:\XXX.FDB', echo=False)
df = pd.DataFrame({"COLUMN1":[], "COLUMN2":[]})
df.to_sql(name="NEWTABLE", con=engine, if_exists = 'replace', index=False, method=None)
DatabaseError: (fdb.fbcore.DatabaseError) ('Error while preparing SQL statement:\n- SQLCODE: -817\n- Dynamic SQL Error\n- SQL error code = -817\n- Metadata update statement is not allowed by the current database SQL dialect 1', -817, 335544569)
[SQL: 
CREATE TABLE "NEWTABLE" (
    COLUMN1 FLOAT, 
    COLUMN2 FLOAT
)

问题出在to_sql查询中的引号"..."

  1. 如何告诉sqlalchemy不要使用引号来兼容Firebird(方言1)?

替代方案:

  1. 不是立即执行查询,而是可以仅从 to_sql 生成查询字符串并稍后使用 result = engine.execute(query) 执行它吗?这将有可能在执行之前修复这些不兼容问题。

我找到了一个可能的解决方案 如果 table 名称是大写的,它会自动用引号引起来

根据实验,我发现这同样适用于 Firebird,即使我没有找到对这个问题的任何适当参考,但只有 something apparently unrelated

更改为

df.to_sql(name="newtable", ...)

解决问题。

如果您创建了模型:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base

base = declarative_base()

class Base(base):
    __abstract__ = True
    __table_args__ = {'quote':False}
    

db = SQLAlchemy(model_class=Base)


class Newtable(Base):
    __tablename__ = 'NEWTABLE '
    column1 = db.Column('COLUMN1', db.Float, quote=False)
    column2 = db.Column('COLUMN2', db.Float, quote=False)