sqlalchemy python 未使用的列名

dat*_*ews 10 python sqlalchemy

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

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

我的代码:

engine.execute(table('customers').insert().values({'company': 'sample name'}))
Run Code Online (Sandbox Code Playgroud)

创建表:

'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'
Run Code Online (Sandbox Code Playgroud)

dat*_*ews 9

经过几个小时的挫折后,我能够测试一种我认为适合我的用例的方法。众所周知,您可以插入到特定列或表中的所有列。在我的用例中,我动态需要插入到客户表中,具体取决于用户有权插入哪些列。

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

最终代码:

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


mat*_*i.o 6

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

我们可以使用Tablefrom 类sqlalchemy.schema并提供enginetoautoload_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'}))
Run Code Online (Sandbox Code Playgroud)