python - 使用 Python 将 SQL 信息提取到 CSV 中,结果为空白

标签 python mysql sql csv

我有一个程序可以用来从我的站点提取调查数据。我用 Python 编写了它,它将从 sql 数据库中获取信息,并将其下载到一个 csv 文件中。它工作得很好,但不知从何而来,它现在只是一个空白的 csv 文件,没有任何信息,也没有大小。下面是我用于拉动的程序。我现在使用 python 3.7.4。

import pymysql.cursors
import csv

import sshtunnel
from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    ('ADDRESS', PORT),
    ssh_username='USERNAME',
    ssh_password='PASS',
    remote_bind_address=('127.0.0.1', 3306)
)

server.start()


def find_number(result, number):
    if str(number) in result['p4'].split(','):
        return 1
    if str(number) in result['p3'].split(','):
        return 2
    if str(number) in result['p2'].split(','):
        return 3
    if str(number) in result['p1'].split(','):
        return 4
    if str(number) in result['z'].split(','):
        return 5
    if str(number) in result['n1'].split(','):
        return 6
    if str(number) in result['n2'].split(','):
        return 7
    if str(number) in result['n3'].split(','):
        return 8
    if str(number) in result['n4'].split(','):
        return 9
    return 'not found: ' + str(number)

# Connect to the database
conn = pymysql.connect(host='127.0.0.1',
                             user='USER',
                             password='PASS',
                             db='DBNAME',
                             charset='utf8mb4',
                       port=server.local_bind_port,
                             cursorclass=pymysql.cursors.DictCursor)

cursor = conn.cursor()


sql = "SELECT * FROM `surveys` order by id asc"
cursor.execute(sql)
results = cursor.fetchall()

output = {}
headers = []
comments = []

for result in results:
    headers.append(str(result['gender']) + '/' + str(result['birth_year']) + '/' + str(result['political_affiliation']) + '/' + str(result['religious_belief']) + '/' + str(result['ethnicity']) + '/' + str(result['location']))
    for nr in range(1, 37):
        if not nr in output:
            output[nr] = []
        nrr = find_number(result, nr)
        output[nr].append(nrr)
    comments.append(result['comments'])

writer = csv.writer(open("output5.csv", 'w', newline=''))
writer.writerow(headers)
for row in output:
    writer.writerow(output[row])
writer.writerow(comments)

conn.close()

最佳答案

可能是 results 返回了一个错误的值,导致您的 for 循环被跳过。如果没有任何结果,您是否尝试过添加检查?

...
results = cursor.fetchall()
if not results:
   raise RuntimeException('Cannot retrieve records from Database!')

此外,不确定您是否知道 defaultdict但您也可以在您的代码片段中使用它来稍微简化一下。

from collections import defaultdict
...
output = defaultdict(list)
for result in results:
 ...
 for nr in range(1, 37):
   output[nr].append(find_number(result, nr))

关于python - 使用 Python 将 SQL 信息提取到 CSV 中,结果为空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58325547/

相关文章:

sql - 仅在 Oracle 中的一列上不同

java - 如何在 Oracle 数据库中使用 JDBC 中的日期和时间

sql - 在 SQL Server 查询中将一列 Rows 转换为只有一列列

python - 计算相关矩阵

mysql - 将大 csv 文件导入 mySql

php - 如何在php中使用prepare语句关闭连接?

php - Mysql 数据库 - 使用下拉框和搜索字段对数据输出进行排序

python - 在 nltk 中打断/分解复杂和复合句子

python - 当值为零时如何完全删除箭袋箭头

python - BeautifulSoup4 with Python3 - 如何使用规则将输出数据分离并写入不同的文件中?