尝试使用 SQLAlchemy 将数据插入雪花数据库表
Posted
技术标签:
【中文标题】尝试使用 SQLAlchemy 将数据插入雪花数据库表【英文标题】:Trying to insert data into Snowflake database table using SQLAlchemy 【发布时间】:2020-11-23 08:08:27 【问题描述】:我在 sql alchemy 中使用declarative_base()
创建了一个模型,如下所示。
class SchemaOnInstance(Base):
__tablename__ = 'schema_on_instance'
__table_args__ =
'extend_existing' : True,
'schema' : 'SFOPT_TEST_SCHEMA'
id = Column(Integer, primary_key=True, autoincrement=True)
created_on = Column(Time, nullable=True)
name = Column(String(100), nullable=True)
is_default = Column(String(50), nullable=True)
is_current = Column(String(50), nullable=True)
database_name = Column(String(200), nullable=True)
owner = Column(String(100), nullable=True)
comment = Column(Text, nullable=True)
options = Column(String(100), nullable=True)
retention_time = Column(Integer, nullable=True)
instance_id = Column(Integer, nullable=True)
def __repr__(self):
return "<SchemaOnInstance()>".format(self.id)
然后我将相同的模型迁移到雪花数据库。
模型有一个字段id
,声明为primary_key=True
和autoincrement=True
。当我尝试使用雪花控制台将数据插入表schema_on_instance
时。我必须提供id
,否则它不会插入数据并返回错误。
查询(执行成功,其中提供了id
)-
INSERT INTO "SFOPT_TEST_SCHEMA".schema_on_instance (id, created_on, name, is_default, is_current, database_name, owner, comment, options, retention_time, instance_id)
VALUES (1, Null, 'Some Name', 'N', 'N', 'DEMO_DB', Null, 'Some comment', Null, 1, 1);
查询(当我完全忽略列id
时执行成功)-
INSERT INTO "SFOPT_TEST_SCHEMA".schema_on_instance (created_on, name, is_default, is_current, database_name, owner, comment, options, retention_time, instance_id)
VALUES (Null, 'Some Name', 'N', 'N', 'DEMO_DB', Null, 'Some comment', Null, 1, 1);
查询(执行失败,id
提供为 Null)-
INSERT INTO "SFOPT_TEST_SCHEMA".schema_on_instance (id, created_on, name, is_default, is_current, database_name, owner, comment, options, retention_time, instance_id)
VALUES (Null, Null, 'Some Name', 'N', 'N', 'DEMO_DB', Null, 'Some comment', Null, 1, 1);
它返回了一个错误 -
NULL result in a non-nullable column
此方法的作用是将数据插入上述数据库表中。
def dump_schema(self):
session = self.Session()
schema_obj = []
for each_schema in self.schema:
schema_obj.append(SchemaOnInstance(created_on=each_schema[0], name=each_schema[1], is_default=each_schema[2], is_current=each_schema[3], database_name=each_schema[4], owner=each_schema[5], comment=each_schema[6], options=each_schema[7], retention_time=each_schema[8], instance_id=each_schema[9]))
session.add_all(schema_obj)
try:
x = session.commit()
except Exception as identifier:
logging.error(identifier)
来自 SQLAlchemy 的错误 -
2020-11-23 08:01:02,215 :: ERROR :: dump_schema :: 95 :: (snowflake.connector.errors.ProgrammingError) 100072 (22000): 01987501-0b18-b6aa-0000-d5e500083d26: NULL result in a non-nullable column
[SQL: INSERT INTO "SFOPT_TEST_SCHEMA".schema_on_instance (id, created_on, name, is_default, is_current, database_name, owner, comment, options, retention_time, instance_id) VALUES (%(id)s, %(created_on)s, %(name)s, %(is_default)s, %(is_current)s, %(database_name)s, %(owner)s, %(comment)s, %(options)s, %(retention_time)s, %(instance_id)s)]
[parameters: 'id': None, 'created_on': datetime.datetime(2020, 11, 23, 0, 0, 58, 29000, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>), 'name': 'INFORMATION_SCHEMA', 'is_default': 'N', 'is_current': 'N', 'database_name': 'DEMO_DB', 'owner': '', 'comment': 'Views describing the contents of schemas in this database', 'options': '', 'retention_time': '1', 'instance_id': 1]
如果我们查看 SQLAlchemy 返回的错误中形成的查询,它考虑了列 id
,其值被解释为 None
。如何在不包含 id
列及其值的情况下形成查询。
我的最终目标是使用 SQLAlchemy 将数据插入到雪花数据库表中。我希望 Snowflake 数据库表自动增加 id
的值。
我应该如何摆脱这个错误。
【问题讨论】:
【参考方案1】:我认为您需要在定义表格时包含一个序列才能使其正常工作:SQLAlchemy Auto-increment Behavior
Sequence 是 Snowflake 中的一个独立对象,需要在创建表之前创建,然后在 CREATE TABLE 语句中引用:CREATE SEQUENCE
【讨论】:
我可以从哪里导入序列。它说序列未定义。以上是关于尝试使用 SQLAlchemy 将数据插入雪花数据库表的主要内容,如果未能解决你的问题,请参考以下文章
Snowflake&SQLAlchemy“意外的'UNIQUE'