Mỗi chương trình cơ sở dữ liệu hỗ trợ các loại dữ liệu khác nhau. Các mô-đun python sqlite và mysqldb cố gắng giúp bạn bằng cách thực hiện các chuyển đổi kiểu thích hợp dựa trên các kiểu trường. Vì vậy, nếu cơ sở dữ liệu mysql của bạn có một trường DECIMAL, MySQLdb sẽ trả về trường đó tự động như một đối tượng Decimal Python.
Bạn có thể yêu cầu MySQLdb (và sqlite nếu bạn muốn) để thực hiện chuyển đổi kiểu thích hợp giữa các loại cơ sở dữ liệu và Python. Tùy thuộc vào bạn để xác định loại chuyển đổi nào là thích hợp. Ví dụ, vì cơ sở dữ liệu của bạn có một trường DECIMAL, làm thế nào bạn sẽ đại diện cho giá trị đó trong sqlite mà không có một trường DECIMAL riêng? Có thể bạn sẽ kết thúc bằng cách sử dụng một REAL, nhưng tất nhiên đây không phải là điều tương tự như một DECIMAL mà sẽ duy trì độ chính xác cần thiết.
Vì bạn đã chuyển đổi từ dữ liệu csv, tôi nghi ngờ bạn đã sử dụng loại phao Python, cho biết bạn sẵn sàng chuyển đổi các trường thập phân MySQL sang phao. Trong trường hợp này, bạn có thể yêu cầu MySQLdb thực hiện chuyển đổi từ DECIMAL để nổi trên tất cả các kết quả trường.
Dưới đây là một ví dụ về mã tạo hai bảng, mỗi bảng trong mysqldb và sqlite. Phiên bản MySQL có một trường DECIMAL. Bạn có thể thấy trong hàm query_dbs
cách tạo các hàm chuyển đổi của riêng bạn.
#!/usr/bin/env python
import os
import sqlite3
import MySQLdb
from MySQLdb.constants import FIELD_TYPE
user = os.getenv('USER')
def create_mysql_table():
conn = MySQLdb.connect(user=user, db='foo')
c = conn.cursor()
c.execute("DROP TABLE stocks")
c.execute("CREATE TABLE stocks"
"(date text, trans text, symbol text, qty real, price Decimal(10,2) UNSIGNED NOT NULL)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.commit()
def create_sqlite_table():
conn = sqlite3.connect('test.db')
c = conn.cursor()
c.execute("DROP TABLE stocks")
c.execute("CREATE TABLE stocks"
"(date text, trans text, symbol text, qty real, price real)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.commit()
def query_dbs(use_type_converters):
conn = sqlite3.connect('test.db')
c = conn.cursor()
for row in c.execute('SELECT * FROM stocks'):
print 'SQLITE: %s' % str(row)
type_converters = MySQLdb.converters.conversions.copy()
if use_type_converters:
type_converters.update({
FIELD_TYPE.DECIMAL: float,
FIELD_TYPE.NEWDECIMAL: float,
})
conn = MySQLdb.connect(user=user, db='foo', conv=type_converters)
c = conn.cursor()
c.execute('SELECT * FROM stocks')
for row in c.fetchall():
print 'MYSQLDB: %s' % str(row)
create_sqlite_table()
create_mysql_table()
print "Without type conversion:"
query_dbs(False)
print "With type conversion:"
query_dbs(True)
kịch bản trên sẽ xuất ra sau trên máy tính của tôi:
Without type conversion:
SQLITE: (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
MYSQLDB: ('2006-01-05', 'BUY', 'RHAT', 100.0, Decimal('35.14'))
With type conversion:
SQLITE: (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
MYSQLDB: ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14)
Điều này được thể hiện, đó là theo mặc định MySQLdb đang trở lại loại thập phân, nhưng có thể bị cưỡng chế trở lại một kiểu khác nhau, phù hợp để sử dụng với sqlite.
Sau đó, khi bạn có tất cả các loại được chuẩn hóa giữa hai cơ sở dữ liệu, bạn sẽ không còn gặp vấn đề với các kết nối.
Tài liệu MySQL MySQL Python là here
Không biết tại sao điều này lại bị bỏ phiếu. Tôi cảm thấy đó là một câu hỏi hay và đáng giá +1. Vì vậy, .. 1. –