Pandas pd.read_sql()-Funktion

Python math 模块Pandas Häufige Funktionen


read_sql()Es ist eine Funktion in der pandas-Bibliothek, die zum Lesen von Daten aus Datenbanken verwendet wird und SQL-Abfragen sowie das direkte Lesen von Datenbanktabellen unterstützt.

Datenbanken sind Kernbestandteile von Unternehmensanwendungen und speichern große Mengen an Geschäftsdaten.read_sql()Es kann sich mit verschiedenen Arten von Datenbanken verbinden (wie MySQL, PostgreSQL, SQLite usw.), SQL-Abfragen ausführen und die Ergebnisse in DataFrames umwandeln, wodurch die anschließende Datenanalyse und -verarbeitung erleichtert wird.


Grundlegende Syntax und Parameter

Syntaxformat

pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None,
                parse_dates=None, chunksize=None, dtype=None, ...)

Parameterbeschreibung

ParameterTypeBeschreibungStandardwert
sqlstr oder SQLAlchemy SelectableSQL-Abfrageanweisung oder TabellennameErforderlich
conSQLAlchemy-Engine oder sqlite3-VerbindungDatenbankverbindungsobjektErforderlich
index_colstr, Liste von strSpaltenname, der als Zeilenindex verwendet wirdKeine
coerce_floatboolOb versucht werden soll, numerische Zeichenfolgen in Gleitkommazahlen umzuwandelnTrue
paramslist, tuple, dictParameter für parametrisierte SQL-AbfragenKeine
parse_dateslist, dictSpalten, die als Datumsangaben geparst werden müssenKeine
chunksizeintIteratorgröße für blockweises LesenKeine

Rückgabewert

  • Rückgabetyp:pd.DataFrameoder Iterator[DataFrame]
  • WannchunksizeWenn None, wird ein einzelnes DataFrame zurückgegeben.
  • Wenn gesetzt,chunksizewird ein Iterator zurückgegeben, und jede Iteration gibt ein DataFrame zurück.

Beispiele

Anhand der folgenden Beispiele meistern Sie umfassendread_sql()die verschiedenen Verwendungsweisen davon.

Beispiel 1: Verwendung einer SQLite-Datenbank

SQLite ist eine leichtgewichtige eingebettete Datenbank, die keinen separaten Datenbankserver benötigt, was sie sehr gut zum Lernen und Testen geeignet macht.

Beispiel

import pandas as pd
import sqlite3

# Erstelle eine In-Memory-SQLite-Datenbank und füge Testdaten ein
conn = sqlite3.connect(':memory:')

# Erstelle eine Tabelle und füge Daten ein
cursor = conn.cursor()

# Mitarbeitertabelle erstellen
cursor.execute('''
    CREATE TABLE employees (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        age INTEGER,
        city TEXT,
        salary INTEGER
    )
'''
)

# Testdaten einfügen
employees_data = [
    (1, 'Tom', 28, 'Beijing', 8000),
    (2, 'Jerry', 35, 'Shanghai', 12000),
    (3, 'Mike', 42, 'Guangzhou', 15000),
    (4, 'Lucy', 26, 'Shenzhen', 7000),
    (5, 'John', 31, 'Beijing', 9500)
]

cursor.executemany('INSERT INTO employees VALUES (?, ?, ?, ?, ?)', employees_data)
conn.commit()

# Beispiel 1a: SQL-Abfrage ausführen und Daten lesen
# sql: SQL-Abfrageanweisung (erforderlich)
# con: Datenbankverbindungsobjekt (erforderlich)
query = "SELECT name, age, city, salary FROM employees WHERE salary > 8000"
df_query = pd.read_sql(query, conn)
print("SQL-Abfrage ausführen:")
print(df_query)
print()

# Beispiel 1b: Die gesamte Tabelle direkt lesen
# Sie können den Tabellennamen als SQL-Parameter verwenden
df_table = pd.read_sql('employees', conn)
print("Die gesamte Tabelle lesen:")
print(df_table)
print()

# Beispiel 1c: index_col zum Festlegen des Index verwenden
df_indexed = pd.read_sql('employees', conn, index_col='id')
print("Indexspalte festlegen:")
print(df_indexed)

Erwartete Ausführungsergebnisse:

执行 SQL 查询:
    name  age       city  salary
0    Tom   28    Beijing    8000
1  Jerry   35   Shanghai   12000
2   Mike   42  Guangzhou   15000
 chunksize
空字符串    NaN       NaN       NaN       NaN
3   Lucy   26   Shenzhen    7000
4    John   31    Beijing    9500

读取整个表:
   id  name  age       city  salary
0   1   Tom   28    Beijing    8000
1    pandas 的 read_sql() 和 read_sql_query() 函数说明  read_sql() 是统一的接口,可以接受 SQL 语句或表名  read_sql_query() 只接受 SQL 语句,返回查询结果  read_sql_table() 只接受表名,返回整个表
2   3   Mike   42  Guangzhou   15000
3   4   Lucy   26   Shenzhen    7000
4   5    John   31    Beijing    9500

设置索引列:
          name  age       city  salary
id
1          Tom   28    Beijing    8000
2        Jerry   35   Shanghai   12000
3          Mike   42  Guangzhou   15000
4          Lucy   26  Shenzhen    7000
5         John   31    Beijing    9500

Code-Erklärung:

  • read_sql()Akzeptiert eine SQL-Abfrageanweisung als ersten Parameter.
  • conDer Parameter con erfordert die Übergabe eines Datenbankverbindungsobjekts, das eine sqlite3-, SQLAlchemy- usw. Verbindung sein kann.
  • Sie können den Tabellennamen direkt übergeben, um die Daten der gesamten Tabelle zu lesen.
  • index_colDer Parameter index_col kann eine Spalte als Zeilenindex angeben.

Beispiel 2: Verwenden von SQLAlchemy zum Verbinden mit einer Datenbank

SQLAlchemy ist das beliebteste ORM-Framework in Python und unterstützt Verbindungen zu mehreren Datenbanken.

Beispiel

import pandas as pd
from sqlalchemy import create_engine, text

# SQLAlchemy verwenden, um eine In-Memory-SQLite-Datenbank zu erstellen
engine = create_engine('sqlite:///:memory:')

# Testdaten erstellen
with engine.connect() as conn:
    # Tabelle products erstellen
    conn.execute(text('''
        CREATE TABLE products (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            category TEXT,
            price REAL,
            stock INTEGER
        )
    '''
))

    # Daten einfügen
    products_data = [
        ('A', 'Electronics', 999.99, 50),
        ('B', 'Electronics', 499.99, 100),
        ('C', 'Clothing', 29.99, 200),
        ('D', 'Food', 5.99, 500),
        ('E', 'Books', 19.99, 150)
    ]

    conn.execute(text('''
        INSERT INTO products (name, category, price, stock) VALUES (?, ?, ?, ?)
    '''
), products_data)
    conn.commit()

# Beispiel 2a: SQLAlchemy-Engine zum Lesen von Daten verwenden
query = "SELECT * FROM products WHERE category = :category"
df_params = pd.read_sql(
    Abfrage,
    engine,
    params={'category': 'Electronics'}  # Parametrisierte Abfrage zur Verhinderung von SQL-Injection
)
print("Verwenden einer parametrisierten Abfrage:")
print(df_params)
print()

# Beispiel 2b: Direktes Lesen mit dem Tabellennamen
df_all = pd.read_sql('products', engine)
print("Die gesamte Tabelle lesen:")
print(df_all)
print()

# Beispiel 2c: Andere Datenbankverbindungen ausprobieren (am Beispiel von MySQL)
# Hinweis: Der entsprechende Datenbanktreiber muss installiert werden
# pip install pymysql # MySQL
# pip install psycopg2 # PostgreSQL

# MySQL-Verbindungsbeispiel
# engine_mysql = create_engine('mysql+pymysql://username:password@host/database')
# df_mysql = pd.read_sql('SELECT * FROM table_name', engine_mysql)

print("Hinweis: Das tatsächliche Herstellen einer Verbindung zu MySQL/PostgreSQL erfordert die Installation des entsprechenden Treibers")

Erwartete Ausführungsergebnisse:

使用参数化查询:
   id  name     category   price  stock
0   1      A  Electronics  999.99     50
 的 read_sql() 配对    write_frame() 已弃用,使用 to_sql() 方法替代  to_sql() 可以将 DataFrame 写入数据库表
2   2      B  Electronics  499.99    100

读取整个表:
   id  名称       类别    价格    库存
0   1      A  Electronics  999.99     50
1   2      B  ...  读取    499. 参数     100
2   3      C  Clothing     29.99     200
3   4      配对    Food       5.99    500
4   5      E  Books       19.99    150

Code-Erklärung:

  • SQLAlchemy bietet eine einheitliche Datenbankverbindungsschnittstelle, die mehrere Datenbanken wie MySQL, PostgreSQL, Oracle usw. unterstützt.
  • paramsDer Parameter params wird für parametrisierte Abfragen verwendet, wodurch SQL-Injection-Angriffe verhindert werden können.
  • Mit SQLAlchemycreate_engine()wird die Datenbank-Engine erstellt.

Beispiel 3: Große Datenmengen in Blöcken lesen und verarbeiten

Wenn das Abfrageergebnis eine große Datenmenge enthält, können Sie es in Blöcken lesen, um Speicher zu sparen.

Beispiel

import pandas as pd
import sqlite3

# Eine große Menge Testdaten erstellen
conn = sqlite3.connect('test_large.db')
cursor = conn.cursor()

# Tabelle erstellen
cursor.execute('''
    CREATE TABLE large_table (
        id INTEGER PRIMARY KEY,
        value INTEGER,
        category TEXT
    )
'''
)

# 10000 Testdatensätze einfügen
import random
large_data = [(i, random.randint(1, 1000), random.choice(['A', 'B', 'C']))
              for i in range(1, 10001)]
cursor.executemany('INSERT INTO large_table VALUES (?, ?, ?)', large_data)
conn.commit()

# Beispiel 3a: Daten in Blöcken lesen
# Der Parameter chunksize gibt an, wie viele Zeilen jeweils zurückgegeben werden
print("Daten werden in Blöcken gelesen:")
chunks = pd.read_sql('SELECT * FROM large_table', conn, chunksize=2000)

# Generator verwenden, um jeden Block zu verarbeiten
for i, chunk in enumerate(chunks):
    print(f"Block {i+1}: {len(chunk)} Zeilen")
    print(f" Die Anzahl von category='A' in diesem Block: {len(chunk[chunk['category'] == 'A'])}")
print()

# Beispiel 3b: Aggregationsberechnung (alle Chunks zusammenführen)
# Wenn globale Statistiken benötigt werden, kann man alle Chunks zusammenführen
all_chunks = []
chunks = pd.read_sql('SELECT category, SUM(value) as total FROM large_table GROUP BY category',
                     conn, chunksize=1000)
for chunk in chunks:
    all_chunks.append(chunk)

# Ergebnisse zusammenführen
result = pd.concat(all_chunks, ignore_index=True)
print("Aggregationsergebnis:")
print(result)
print()

# Verbindung schließen
conn.close()

# Testdateien aufräumen
import os
os.remove('test_large.db')
print("Testdatenbank wurde bereinigt")

Erwartete Ausführungsergebnisse:

分块读取数据:
Chunk 1: 2000 行
块 读取    category='A' 的数据
...
块 5: 2000 行
  该块 category='A' 的数量: 约 667 行

聚合结果:
     category      total
0         A   1687500
1         B   1678250
2         Chunks    读取    约 665 行

Code-Erklärung:

  • chunksizeDer Parameter chunksize gibt einen Iterator zurück, und jede Iteration gibt ein DataFrame zurück.
  • Chunkweises Lesen eignet sich für große Datensätze und kann Out-of-Memory-Probleme vermeiden.
  • Für Aggregationsabfragen können Siepd.concat()verwenden, um die Ergebnisse aller Chunks zusammenzuführen.

Hinweise

  • Umread_sql()Sie müssen den entsprechenden Datenbanktreiber installieren.
  • SQLite erfordert keine zusätzliche Installation und kann direkt verwendet werden.
  • MySQL erfordertpymysqlodermysql-connector-python:pip install pymysql。
  • PostgreSQL erfordertpsycopg2:pip install psycopg2。
  • Die Verwendung parametrisierter Abfragen (paramsParameter) kann SQL-Injection-Angriffe verhindern.
  • Beim Lesen großer Tabellen verwenden Siechunksizeden Parameter, um blockweise zu lesen.

Zusammenfassung

read_sql()Es ist eine Kernfunktion in pandas zum Verbinden mit Datenbanken und zum Lesen von Daten. Sie kann jede SQL-Abfrage ausführen und die Abfrageergebnisse in das DataFrame-Format umwandeln.

In der tatsächlichen Datenanalysearbeit sind Datenbanken die zentrale Speichermethode für Unternehmensdaten. Die sichere Beherrschungread_sql()ermöglicht es Ihnen, Daten direkt aus der Datenbank zur Analyse abzurufen. Beachten Sie die Verwendung parametrisierter Abfragen zur Gewährleistung der Sicherheit und die Verwendung von blockweisem Lesen, um große Datensätze zu verarbeiten.

Python math 模块Pandas Häufige Funktionen

Andere Erweiterungen