SQLite如何基于提取的表数据创建新表?解决CREATE TABLE语法报错
错误原因
SQLite的CREATE TABLE ... AS SELECT语法不支持在AS关键字后为SELECT子句添加外层圆括号,你代码里的括号直接触发了语法报错,完全不需要先把查询结果读成pandas DataFrame再回写数据库。
修正方案
直接删除AS后包裹SELECT语句的那对圆括号即可,修正后的执行语句为:
create table if not exists T2 AS SELECT column1,column3 FROM T1 WHERE column3='a' GROUP BY column2
完整可运行代码如下:
import pandas as pd import sqlite3 df = pd.DataFrame( data={'column1': [10, 20, 30, 40], 'column2': [0, 1, 1, 0], 'column3': ['a', 'b', 'a', 'b']}) dbname = 'TEST.db' con = sqlite3.connect(dbname) cur = con.cursor() df.to_sql("T1", con, if_exists="replace", method="multi", chunksize=1000) # 移除AS后SELECT外层的括号即可正常执行 con.execute("create table if not exists T2 AS SELECT column1,column3 FROM T1 WHERE column3='a' GROUP BY column2") df_sqlquery = pd.read_sql_query(sql="SELECT * FROM T2", con=con) # 用完记得关闭数据库连接 con.close() print(df_sqlquery)
补充说明
- 你当前SQL里
GROUP BY column2没有对column1做聚合,SQLite默认配置下会返回每个分组下随机匹配的行,如果需要明确取分组内的特定值,建议搭配聚合函数使用,比如要取每个分组column1的最大值,可以写为SELECT max(column1) as column1, column3 FROM T1 WHERE column3='a' GROUP BY column2 - 直接用SQL原生的CTAS(CREATE TABLE AS SELECT)语法在库内完成建表导数据,性能远高于把数据读到pandas再回写的方案,数据量越大优势越明显,没有特殊需求不需要做pandas层的中转。
内容的提问来源于stack exchange,提问作者user52980
相关产品推荐
相关产品推荐

