2010-02-27 31 views
16

Cơ sở dữ liệu sqlite3 của tôi chứa ràng buộc cột "đối chiếu". Tôi đã đặt nó trong lược đồ cho bảng, để tránh vô tình bỏ qua việc sử dụng collation cần thiết. Tuy nhiên điều này có nghĩa là khi chạy sqlite3 từ dòng lệnh và không phải từ mã Python của tôi, collation được tham chiếu trong lược đồ không có mặt, và tôi không thể sử dụng lệnh dấu chấm.Thực hiện lệnh sqlite3 "chấm" từ Python hoặc đăng ký đối chiếu trong tiện ích dòng lệnh

sqlite> .import data.txt table_name 
Error: no such collation sequence: my_collation 

Bên cạnh đó, việc tạo ra các kết nối từ Python, và thêm collation cần chạy vào vấn đề này:

connWithCollation.execute(".import data.txt table_name") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: near ".": syntax error 

Các execute chức năng nó sẽ xuất hiện không muốn vượt qua sqlite3 dot lệnh qua.

Làm cách nào để thực thi lệnh sqlite3 dot khi không có chức năng đối chiếu cần thiết? Ngoài ra, làm thế nào tôi có thể thực thi các lệnh sqlite3 dot từ Python?

Trả lời

6

Bạn có thể tải chuỗi và chức năng đối chiếu mới bằng cách sử dụng hàm load_extension() SQLite dựng sẵn hoặc .load lệnh trong trình bao dòng lệnh cho SQLite. Rõ ràng, phần mở rộng shold được viết bằng C.

Và bạn không thể gọi dấu chấm lệnh từ python, bởi vì dấu chấm lệnh là cụ thể cho công cụ dòng lệnh shell.

7

Lệnh chấm chỉ khả dụng cho sqlite3 thực thi. Bạn sẽ phải thay thế chúng bằng sự kết hợp tương đương của mã Python và các cuộc gọi DB-API để bắt chước hành vi của chúng.

+1

Một số lệnh có vẻ xa tầm thường. Bạn sẽ thêm tiêu đề như thế nào hoặc chọn dấu tách cột? –

8

Lệnh .import trong vỏ sqlite là lệnh nội trang. Nó được xử lý bởi chương trình shell, không phải là công cụ SQL, vì vậy bạn không thể thực hiện nó như một câu lệnh SQL.

Đọc mã cho SQLite của shell.c, có vẻ như .import chỉ đơn giản là một vòng lặp, đọc dòng từ tập tin dữ liệu, chia tách vào tách, và đi qua các lĩnh vực như các giá trị tham số để một chuẩn bị INSERT tuyên bố. Vì vậy, bạn sẽ có thể bắt chước hành vi của .import với mã Python dễ dàng.

Tôi đã thử nghiệm sau đây với Python 2.6:

import sqlite3 
import csv 

conn = sqlite3.connect(':memory:') 

conn.execute('create table mytable (col1 text, col2 text, col3 text)') 

csvReader = csv.reader(open('mydata.csv'), delimiter=',', quotechar='"') 

for row in csvReader: 
     conn.execute('insert into mytable (col1, col2, col3) values (?, ?, ?)', row) 

cur = conn.cursor() 
cur.execute('select * from mytable') 
print cur.fetchall() 
+0

Câu trả lời tuyệt vời cho một nửa câu hỏi của tôi :) –

+0

Câu trả lời hoàn hảo/ví dụ để giúp mọi người bắt đầu lập trình SQLite bằng Python! – Blairg23

0

Bạn có thể gọi lệnh chấm từ Python sử dụng mô-đun subprocess, mà về cơ bản gọi một vỏ. Nếu bạn cần sử dụng nhiều lệnh dấu chấm, bạn có thể chuyển chúng thành các đối số vỏ riêng biệt - sử dụng dấu chấm phẩy để tách chúng sẽ không hoạt động.

import subprocess 
subprocess.call(["sqlite3", "xxx.db", 
    ".mode tabs", 
    ".import file.tsv table_name"]) 
Các vấn đề liên quan