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
查询中的引号"..."
。
- 如何告诉sqlalchemy不要使用引号来兼容Firebird(方言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)
我是 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
查询中的引号"..."
。
- 如何告诉sqlalchemy不要使用引号来兼容Firebird(方言1)?
替代方案:
- 不是立即执行查询,而是可以仅从
to_sql
生成查询字符串并稍后使用result = engine.execute(query)
执行它吗?这将有可能在执行之前修复这些不兼容问题。
我找到了一个可能的解决方案
根据实验,我发现这同样适用于 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)