Sqlalchemy + Firebird: как убрать кавычки - PullRequest
2 голосов
/ 24 февраля 2020

Я новичок в SqlAlchemy и Firebird DB.

Я могу напрямую создать таблицу, используя DBeaver:

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)?

как альтернатива:

Вместо того, чтобы выполнить запрос немедленно, возможно ли создать строку запроса только из to_sql и выполнить ее позже с result = engine.execute(query)? Это дало бы возможность исправить эти несовместимости перед выполнением.

1 Ответ

2 голосов
/ 24 февраля 2020

Я нашел возможное решение, читающее Избавьтесь от двойных кавычек с помощью SQLalchemy для PostgreSQL: , если имя таблицы в верхнем регистре, оно автоматически будет заключено в кавычки отметки .

Экспериментально я вижу, что то же самое относится к Firebird , даже если я не нашел какой-либо надлежащей ссылки на эту проблему, но только что-то явно не связанное

Изменение на

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

решает проблему.

...