未汇总的列名sqlalchemy-python



我在使用SQLAlchemy时遇到以下错误:Unconsumed column names: company

我想插入一个特定列的数据,而不是表中所有列的数据:INSERT INTO customers (company) VALUES ('sample name');

我的代码:

engine.execute(table('customers').insert().values({'company': 'sample name'}))

创建表格:

'CREATE TABLE `customers` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`company` varchar(255) DEFAULT NULL,
`first_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
UNIQUE KEY `company_UNIQUE` (`company`)
) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8'

在经历了几个小时的挫折之后,我能够测试一种我认为适用于我的用例的方法。正如我们所知,您可以插入到特定的列,或者表中的所有列。在我的用例中,我动态地需要插入到customers表中,这取决于用户有权插入的列

我发现我需要在sqlalchemy的table()方法中定义所有列,但我可以将我动态需要的任何列和值传递给values()方法。

最终代码:

engine.execute(table('customers', column('company'), column('first_name'), column('last_name'), column('email'), column('phone')).insert().values({'company': 'sample name'}))

最初的解决方案效果很好,但我想添加另一种方法,允许动态处理表,而无需指定其所有列。这在处理多个表时非常有用。

我们可以使用sqlalchemy.schema中的Table类,并将engine提供给它的autoload_with参数,这将反映模式并为我们填充列。

然后,我们可以像OP的答案一样工作。

from sqlalchemy.schema import Table, MetaData
my_table_name = 'customers'  # Could be passed as an argument as well :)
table = Table(my_table_name, MetaData(), autoload_with=engine)
engine.execute(my_table.insert({'company': 'sample name'}))

最新更新