问题描述
为此,我尝试想出一个像这样的 while 循环:
def create_csv():
query = QsqlQuery(db=db)
query.prepare("SELECT * FROM database_name")
query.exec()
rec = query.record()
print(query.isSelect())
nameCol = rec.indexOf("name")
while query.next():
print(query.value(nameCol))
这按预期为我提供了“名称”列中的所有条目。 但是由于数据库有更多的列, 我想知道是否有一种更简单的方法可以一次获取所有列(和标题)?
一次完成将使 csv 的创建变得容易得多。
解决方法
你可以用一个简单的 SQL 命令来做到这一点:
select * from passtable4 LOCAL INTO OUTFILE 'C:\test.csv' FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"' LINES TERMINATED BY '\r\n';
您可能会遇到此错误:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
如果您的数据库具有不同类型的数据类型(如日期、BLOB 等),您可以找到更全面的指南here
,花了一段时间,但我想我找到了对我有用的东西:
- 我首先为文件构建名称并生成了 2 个列表
- 执行查询,提供表的所有值
- 开始一个 for 循环来获取标题。
- 开始一个while循环,它为我生成临时列表元素“行”
- 将临时列表元素添加到值列表中,使其成为列表列表
- 构建了一个 Pandas 数据框并根据需要使用了 to_csv。
我确信有“更聪明”或更快的方法来完成这项工作。但至少它对我有用。
def create_csv(self):
today = datetime.today()
now = today.strftime("%y%m%d_%H%M_%S_")
filename = f"{jetzt}COS.csv"
Column_Header=[]
Article_Value=[]
query = QSqlQuery(db=db)
query.prepare(r"SELECT * FROM database_name")
query.exec()
rec = query.record()
for id in range(rec.count()):
Column_Header.append(rec.fieldName(id))
indexes = range(rec.count())
while query.next():
row = [query.value(index) for index in indexes]
Article_Value.append(row)
df = pd.DataFrame(Article_Value,columns=Column_Header,index=None)
print(df)
df.to_csv(filename,sep=';',index=False)