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)
经过几个小时的挫折后,我能够测试一种我认为适合我的用例的方法。众所周知,您可以插入到特定列或表中的所有列。在我的用例中,我动态需要插入到客户表中,具体取决于用户有权插入哪些列。
我发现我需要在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)
原始解决方案效果很好,但是我想添加另一种方法,该方法允许动态处理表,而无需指定其所有列。这在处理多个表时非常有用。
我们可以使用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)
| 归档时间: |
|
| 查看次数: |
14421 次 |
| 最近记录: |