精华内容
下载资源
问答
  • 语言:English 您在看YT到MP3转换器吗? 通过使用我们的转换器,您可以轻松地免费将YT转换为MP3(音频)-此服务适用于计算机,平板电脑和移动设备。 视频始终以最高的可用质量进行转换。 请注意,我们最多只能转换1...
  • x = [-1, 0, 1, 2, 3, 4] y = [-3, -1, 1, 3, 5, 7] model = tf.keras.models.Sequential( [tf.keras.layers.Dense(units=1, input_shape=[1])]) model.compile(optimizer='sgd', loss='mean_squared_error') model...

    Python API

    在 TensorFlow 2.0 中,用来将原始的 TensorFlow 模型格式转换为 TensorFlow Lite 的 Python API 是 tf.lite.TFLiteConverter。在 TFLiteConverter 中有以下的类方法(classmethod):

    注意: 在 TensorFlow Lite 2.0 中有一个不同版本的 TFLiteConverter API, 该 API 只包含了 from_concrete_function。 本文中用到的的新版本 API 可以通过 pip 安装 tf-nightly-2.0-preview

    本文展示了 API 的 示例用法,不同 TensorFlow 版本的 API 详细列表请看 1.X 版本到 2.0 版本 API 的改变,和 安装 TensorFlow 来安装和使用。

    示例

    转换 SavedModel 格式模型

    以下示例展示了如何将一个 SavedModel 转换为 TensorFlow Lite 中的 FlatBuffer格式。

     

    import tensorflow as tf
    
    # 建立一个简单的模型。
    root = tf.train.Checkpoint()
    root.v1 = tf.Variable(3.)
    root.v2 = tf.Variable(2.)
    root.f = tf.function(lambda x: root.v1 * root.v2 * x)
    
    # 保存模型。
    export_dir = "/tmp/test_saved_model"
    input_data = tf.constant(1., shape=[1, 1])
    to_save = root.f.get_concrete_function(input_data)
    tf.saved_model.save(root, export_dir, to_save)
    
    # 转换模型。
    converter = tf.lite.TFLiteConverter.from_saved_model(export_dir)
    tflite_model = converter.convert()
    

    此 API 不支持指定输入向量的维度。 如果您的模型需要指定输入向量的维度,请使用 from_concrete_functions 来完成。 示例:

     

    model = tf.saved_model.load(export_dir)
    concrete_func = model.signatures[
      tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
    concrete_func.inputs[0].set_shape([1, 256, 256, 3])
    converter = TFLiteConverter.from_concrete_functions([concrete_func])
    

    转换 Keras 模型

    以下示例展示了如何将一个 tf.keras 模型 转换为 TensorFlow Lite 中的 FlatBuffer 格式。

     

    import tensorflow as tf
    
    # 创建一个简单的 Keras 模型。
    x = [-1, 0, 1, 2, 3, 4]
    y = [-3, -1, 1, 3, 5, 7]
    
    model = tf.keras.models.Sequential(
        [tf.keras.layers.Dense(units=1, input_shape=[1])])
    model.compile(optimizer='sgd', loss='mean_squared_error')
    model.fit(x, y, epochs=50)
    
    # 转换模型。
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_model = converter.convert()
    

    转换 concrete function

    以下示例展示了如何将 TensorFlow 中的 concrete function 转换为TensorFlow Lite 中的 FlatBuffer 格式。

     

    import tensorflow as tf
    
    # 建立一个模型。
    root = tf.train.Checkpoint()
    root.v1 = tf.Variable(3.)
    root.v2 = tf.Variable(2.)
    root.f = tf.function(lambda x: root.v1 * root.v2 * x)
    
    # 生成 concrete function。
    input_data = tf.constant(1., shape=[1, 1])
    concrete_func = root.f.get_concrete_function(input_data)
    
    # 转换模型。
    #
    # `from_concrete_function` 的传入参数被设计为一个一个 concrete function 的列表,然而
    # 现阶段仅支持每次调用时仅接受一个concrete function。
    # 同时转换多个concrete function的功能正在开发中。
    converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
    tflite_model = converter.convert()
    

    端到端 MobileNet 转换

    以下示例展示了如何将将一个提前训练好的 tf.keras MobileNet 模型转换为 TensorFlow Lite 支持的类型并运行推断 (inference)。 随机数据分别在 TensorFlow 和 TensorFlow Lite 模型中运行的结果将被比较。如果是从文件加载模型,请使用 model_path 来代替 model_content

     

    import numpy as np
    import tensorflow as tf
    
    # 加载 MobileNet tf.keras 模型。
    model = tf.keras.applications.MobileNetV2(
        weights="imagenet", input_shape=(224, 224, 3))
    
    # 转换模型。
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_model = converter.convert()
    
    # 加载 TFLite 模型并分配张量(tensor)。
    interpreter = tf.lite.Interpreter(model_content=tflite_model)
    interpreter.allocate_tensors()
    
    # 获取输入和输出张量。
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()
    
    # 使用随机数据作为输入测试 TensorFlow Lite 模型。
    input_shape = input_details[0]['shape']
    input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)
    interpreter.set_tensor(input_details[0]['index'], input_data)
    
    interpreter.invoke()
    
    # 函数 `get_tensor()` 会返回一份张量的拷贝。
    # 使用 `tensor()` 获取指向张量的指针。
    tflite_results = interpreter.get_tensor(output_details[0]['index'])
    
    # 使用随机数据作为输入测试 TensorFlow 模型。
    tf_results = model(tf.constant(input_data))
    
    # 对比结果。
    for tf_result, tflite_result in zip(tf_results, tflite_results):
      np.testing.assert_almost_equal(tf_result, tflite_result, decimal=5)
    

    总结 1.X 版本到 2.0 版本 API 的改变

    本节总结了从 1.X 到 2.0 版本 Python API 的改变。 如果对某些改动有异议,请提交 GitHub issue

    TFLite转换器 支持的格式类型

    TFLite转换器 在 2.0 版本中支持由 1.X 版本和 2.0 版本生成的 SavedModels 和 Keras 模型。但是,转换过程不再支持由 1.X 版本冻结的 GraphDefs。 开发者可通过调用 tf.compat.v1.lite.TFLiteConverter 来把冻结的 GraphDefs 转换到 TensorFlow Lite 版本。

    量化感知训练(Quantization-aware training)

    以下与 量化感知训练(Quantization-aware training) 有关的属性和方法在 TensorFlow 2.0 中从TFLiteConverter 中被移除。

    • inference_type
    • inference_input_type
    • quantized_input_stats
    • default_ranges_stats
    • reorder_across_fake_quant
    • change_concat_input_ranges
    • post_training_quantize - 在 1.X API 中被弃用
    • get_input_arrays()

    支持量化感知训练的重写器(rewriter)函数不支持由 TensorFlow 2.0 生成的模型。此外,TensorFlow Lite 的量化 API 已按支持 Keras 中量化感知训练 API 的思路重新设计和精简。 在新的量化 API 部署前,这些属性将不会出现在 2.0 的 API 中。开发者可以使用 tf.compat.v1.lite.TFLiteConverter 来转换由重写器函数生成的模型。

    关于 TFLiteConverter 中属性的改变

    属性 target_ops 已成为 TargetSpec 中的属性且作为未来对优化框架的补充被重命名为 supported_ops

    此外,以下属性被移除:

    • drop_control_dependency (default: True) - TFLite 现不支持控制流(control flow),所以此属性将恒为 True
    • Graph visualization - 在 TensorFlow 2.0 中,推荐使用 visualize.py 实现对 TensorFlow Lite 图(graph)的可视化。 不同于 GraphViz, 它支持开发者对已进行过 post training 量化的图(graph)可视化。以下与图可视化的属性将被移除:
      • output_format
      • dump_graphviz_dir
      • dump_graphviz_video

    通用 API 的改变

    转换方法

    以下在 1.X 中被弃用的方法不会在 2.0 中出现:

    • lite.toco_convert
    • lite.TocoConverter

    lite.constants

    在 2.0 中,为了减少 TensorFlow 和 TensorFlow Lite 之间的重复移除了 lite.constants API。以下的列表展示了 lite.constant 中的类型在 TensorFlow 中对应的类型:

    此外,lite.constants.TFLITE 和 lite.constants.GRAPHVIZ_DOT 被移除(由于 TFLiteConverter 中的 flage output_format被移除)。

    lite.OpHint

    由于 API OpHint 与 2.0 的 API 不兼容,故暂不可用。 此 API可用于转换基于 LSTM 的模型。 在 2.0 中对 LSTMs 的支持正在被探究。所有与 lite.experimental 有关的 API 都因此被移除。

    安装 TensorFlow

    安装 TensorFlow 2.0 nightly

    可用以下命令安装 TensorFlow 2.0 nightly:

     

    pip install tf-nightly-2.0-preview
    

    在已安装的 1.X 中使用 TensorFlow 2.0

    可通过以下代码片段从最近安装的 1.X 中使用 TensorFlow 2.0。

     

    import tensorflow.compat.v2 as tf
    
    tf.enable_v2_behavior()
    展开全文
  • FFmpeg video converter

    千次阅读 2008-11-23 19:49:00
    It will use the files: /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V, /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...  The Y files use twice the resolution of the U and V ...
    ffmpeg [[options][-i input_file]]... {[options] output_file}... 
    
    DESCRIPTION 

    If no input file is given, audio/video grabbing is done. 

    As a general rule, options are applied to the next specified file. For example, if you give the -b 64 option, it sets the video bitrate of the next file. Format option may be needed for raw input files. 

    By default, ffmpeg tries to convert as losslessly as possible: it uses the same audio and video parameter for the outputs as the one specified for the inputs. 
    OPTIONS 

    "Main options" 

    show license show help show available formats, codecs, protocols, ... force format input file name overwrite output files set the recording time in seconds. hh:mm:ss[.xxx] syntax is also supported. set the title set the author set the copyright set the comment activate high quality settings 
    "Video Options" 

    set the video bitrate in kbit/s (default = 200 kb/s) set frame rate (default = 25) set frame size. The format is WxH (default 160x128). The following abbreviations are recognized: 128x96 176x144 352x288 704x576 set aspect ratio (4:3, 16:9 or 1.3333, 1.7777) set top crop band size (in pixels) set bottom crop band size (in pixels) set left crop band size (in pixels) set right crop band size (in pixels) disable video recording set video bitrate tolerance (in kbit/s) set max video bitrate tolerance (in kbit/s) set min video bitrate tolerance (in kbit/s) set ratecontrol buffere size (in kbit) force video codec to codec. Use the copy special value to tell that the raw codec data must be copied as is. use same video quality as source (implies VBR) select the pass number (1 or 2). It is useful to do two pass encoding. The statistics of the video are recorded in the first pass and the video at the exact requested bit rate is generated in the second pass. select two pass log file name to file. 
    "Advanced Video Options" 

    set the group of picture size use only intra frames use fixed video quantiser scale (VBR) min video quantiser scale (VBR) max video quantiser scale (VBR) max difference between the quantiser scale (VBR) video quantiser scale blur (VBR) video quantiser scale compression (VBR) initial complexity for 1-pass encoding qp factor between p and b frames qp factor between p and i frames qp offset between p and b frames qp offset between p and i frames set rate control equation. Default is tex^qComp. rate control override for specific intervals set motion estimation method to method. Available methods are (from lower to best quality): Try just the (0, 0) vector. (default method) exhaustive search (slow and marginally better than epzs) set dct algorithm to algo. Available values are: FF_DCT_AUTO (default) FF_DCT_FASTINT FF_DCT_INT FF_DCT_MMX FF_DCT_MLIB FF_DCT_ALTIVEC set idct algorithm to algo. Available values are: FF_IDCT_AUTO (default) FF_IDCT_INT FF_IDCT_SIMPLE FF_IDCT_SIMPLEMMX FF_IDCT_LIBMPEG2MMX FF_IDCT_PS2 FF_IDCT_MLIB FF_IDCT_ARM FF_IDCT_ALTIVEC FF_IDCT_SH4 FF_IDCT_SIMPLEARM set error resilience to n. FF_ER_CAREFULL (default) FF_ER_COMPLIANT FF_ER_AGGRESSIVE FF_ER_VERY_AGGRESSIVE set error concealment to bit_mask. bit_mask is a bit mask of the following values: FF_EC_GUESS_MVS (default=enabled) FF_EC_DEBLOCK (default=enabled) use "frames" B frames (only MPEG-4) macroblock decision FF_MB_DECISION_SIMPLE: use mb_cmp (cannot change it yet in ffmpeg) FF_MB_DECISION_BITS: chooses the one which needs the fewest bits FF_MB_DECISION_RD: rate distoration use four motion vector by macroblock (only MPEG-4) use data partitioning (only MPEG-4) workaround not auto detected encoder bugs how strictly to follow the standarts enable Advanced intra coding (h263+) enable Unlimited Motion Vector (h263+) deinterlace pictures calculate PSNR of compressed frames dump video coding statistics to vstats_HHMMSS.log. insert video processing module. module contains the module name and its parameters separated by spaces. 
    "Audio Options" 

    set audio bitrate (in kbit/s) set the audio sampling freq (default = 44100 Hz) set the audio bitrate in kbit/s (default = 64) set the number of audio channels (default = 1) disable audio recording force audio codec to codec. Use the copy special value to tell that the raw codec data must be copied as is. 
    "Audio/Video grab options" 

    set video grab device (e.g. /dev/video0) set video grab channel (DV1394 only) set television standard (NTSC, PAL (SECAM)) set DV1394 grab set audio device (e.g. /dev/dsp) 
    "Advanced options" 

    set input stream mapping print specific debug info add timings for benchmarking dump each input packet only use bit exact algorithms (for codec testing) set packet size in bits read input at native frame rate. Mainly used to simulate a grab device. loop over the input stream. Currently it works only for image streams. This option is used for ffserver automatic testing. 
    "FFmpeg formula evaluator" 

    When evaluating a rate control string, FFmpeg uses an internal formula evaluator. 

    The following binary operators are available: +, -, *, /, ^. 

    The following unary operators are available: +, -, (...). 

    The following functions are available: 

    The following constants are available: 
    EXAMPLES 

    "Video and Audio grabbing" 

    FFmpeg can use a video4linux compatible video source and any Open Sound System audio source: 



    ffmpeg /tmp/out.mpg 

    Note that you must activate the right video source and channel before launching ffmpeg. You can use any TV viewer such as xawtv (<http://bytesex.org/xawtv/>) by Gerd Knorr which I find very good. You must also set correctly the audio recording levels with a standard mixer. 
    "Video and Audio file format conversion" 

    * ffmpeg can use any supported file format and protocol as input: 

    Examples: 

    * You can input from YUV files: 



    ffmpeg -i /tmp/test%d.Y /tmp/out.mpg 

    It will use the files: /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V, /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc... 

    The Y files use twice the resolution of the U and V files. They are raw files, without header. They can be generated by all decent video decoders. You must specify the size of the image with the -s option if ffmpeg cannot guess it. 

    * You can input from a RAW YUV420P file: 



    ffmpeg -i /tmp/test.yuv /tmp/out.avi 

    The RAW YUV420P is a file containing RAW YUV planar, for each frame first come the Y plane followed by U and V planes, which are half vertical and horizontal resolution. 

    * You can output to a RAW YUV420P file: 



    ffmpeg -i mydivx.avi -o hugefile.yuv 

    * You can set several input files and output files: 



    ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg 

    Convert the audio file a.wav and the raw yuv video file a.yuv to mpeg file a.mpg 

    * You can also do audio and video conversions at the same time: 



    ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2 

    Convert the sample rate of a.wav to 22050 Hz and encode it to MPEG audio. 

    * You can encode to several formats at the same time and define a mapping from input stream to output streams: 



    ffmpeg -i /tmp/a.wav -ab 64 /tmp/a.mp2 -ab 128 /tmp/b.mp2 -map 0:0 -map 0:0 

    Convert a.wav to a.mp2 at 64 kbits and b.mp2 at 128 kbits. "-map file:index" specify which input stream is used for each output stream, in the order of the definition of output streams. 

    * You can transcode decrypted VOBs 



    ffmpeg -i snatch_1.vob -f avi -vcodec mpeg4 -b 800 -g 300 -bf 2 -acodec mp3 -ab 128 snatch.avi 

    This is a typical DVD ripper example, input from a VOB file, output to an AVI file with MPEG-4 video and MP3 audio, note that in this command we use B frames so the MPEG-4 stream is DivX5 compatible, GOP size is 300 that means an INTRA frame every 10 seconds for 29.97 fps input video. Also the audio stream is MP3 encoded so you need LAME support which is enabled using --enable-mp3lame when configuring. The mapping is particularly useful for DVD transcoding to get the desired audio language. 

    NOTE: to see the supported input formats, use ffmpeg -formats.
    展开全文
  • FILTER=y  68 # PLUGIN=y [lingyun@localhost pppd]$ cd .. [lingyun@localhost ppp-2.4.4]$ make make[1]: Leaving directory `/usr/local/src/lingyun/fulinux/ppp/ppp-2.4.4/pppdump' ...

    一、      PPP移植

    各项工作具体说明

    向linux内核添加3G模块的驱动(USB转串口驱动)和PPP协议的支持,然后编译内核并下载到开发板。当然如果之前已经移植好内核,那么只需要增加几个选项就可以,然后在编译内核就可以了,这个文档默认内核已经移植过,所以只讲与USB转串口驱动和PPP协议支持的几个选项。

    [lingyun@localhost linux-3.0]$ make menuconfig

    1、USB的驱动要选这几个:

    DeviceDrivers---→

    展开全文
  • sqlite3- SQLite数据库的DB-API 2.0接口

    千次阅读 2018-11-09 13:10:14
    sqlite3- SQLite数据库的DB-API 2.0接口 SQLite是一个C库,它提供了一个基于磁盘的轻量级数据库,它不需要单独的服务器进程,并允许使用SQL查询语言的非标准变体访问数据库。某些应用程序可以使用SQLite进行内部数据...

    sqlite3- SQLite数据库的DB-API 2.0接口

    SQLite是一个C库,它提供了一个基于磁盘的轻量级数据库,它不需要单独的服务器进程,并允许使用SQL查询语言的非标准变体访问数据库。某些应用程序可以使用SQLite进行内部数据存储。也可以使用SQLite对应用程序进行原型设计,然后将代码移植到更大的数据库,如PostgreSQL或Oracle。

    pysqlite由GerhardHäring编写,提供符合DB-API 2.0规范的SQL接口 PEP 249

    要使用该模块,必须首先创建一个Connection表示数据库的对象。这里的数据将存储在/tmp/example文件中:

    conn  =  sqlite3 .connect ('/ tmp / example'

    您还可以提供特殊名称:memory:以在RAM中创建数据库。

    获得之后Connection,您可以创建一个Cursor 对象并调用其execute()方法来执行SQL命令:

    c = conn.cursor()
    
    # 创建表
    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()
    
    # 如果事务完成,关闭光标
    c.close()
    

    通常,您的SQL操作需要使用Python变量中的值。你不应该使用Python的字符串操作来组装你的查询,因为这样做是不安全的; 它使您的程序容易受到SQL注入攻击。

    而是使用DB-API的参数替换。?在任何想要使用值的位置放置占位符,然后提供值元组作为游标execute()方法的第二个参数。(其他数据库模块可能使用不同的占位符,例如%s:1。)例如:

    # 永远不要这样做 - 不安全!
    symbol = 'IBM'
    c.execute("... where symbol = '%s'" % symbol)
    
    # 而是这样做
    t = (symbol,)
    c.execute('select * from stocks where symbol=?', t)
    
    # 多参数的示例
    for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
              ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
              ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
             ]:
        c.execute('insert into stocks values (?,?,?,?,?)', t)
    

    要在执行SELECT语句后检索数据,可以将游标视为迭代器,调用游标的fetchone()方法以检索单个匹配行,或调用fetchall()以获取匹配行的列表。

    此示例使用迭代器形式:

    >>> c = conn.cursor()
    >>> c.execute('select * from stocks order by price')
    >>> for row in c:
    ...    print row
    ...
    (u'2006-01-05', u'BUY', u'RHAT', 100, 35.14)
    (u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)
    (u'2006-04-06', u'SELL', u'IBM', 500, 53.0)
    (u'2006-04-05', u'BUY', u'MSOFT', 1000, 72.0)
    >>>
    

    模块函数和常量

    • sqlite3.``PARSE_DECLTYPES

      此常量用于与函数的detect_types参数 一起使用connect()。设置它使sqlite3模块解析它返回的每个列的声明类型。它将解析出声明类型的第一个单词,即对于“整数主键”,它将解析出“整数”,或者对于“数字(10)”,它将解析出“数字”。然后对于该列,它将查看转换器字典并使用在那里注册的转换器函数。

    • sqlite3.``PARSE_COLNAMES

      此常量用于与函数的detect_types参数 一起使用connect()。设置此选项会使SQLite接口解析它返回的每个列的列名。它将在那里查找形成[mytype]的字符串,然后确定’mytype’是列的类型。它将尝试在转换器字典中找到“mytype”的条目,然后使用在那里找到的转换器函数来返回值。找到的列名Cursor.description 只是列名的第一个单词,即如果你在SQL中使用类似的东西 ,那么我们将解析所有内容,直到列名的第一个空白:列名只是“x”。'as "x [datetime]"'

    • sqlite3.``connectdatabase [,timeoutisolation_leveldetect_typesfactory ])

      打开与SQLite数据库文件数据库的连接。您可以使用 ":memory:"打开与驻留在RAM而不是磁盘上的数据库的数据库连接。当多个连接访问数据库,并且其中一个进程修改数据库时,SQLite数据库将被锁定,直到提交该事务为止。该超时参数指定连接应该多长时间等待锁消失,直到引发异常。timeout参数的默认值为5.0(五秒)。对于isolation_level参数,请参阅对象的 Connection.isolation_level属性Connection。SQLite本身仅支持TEXT,INTEGER,REAL,BLOB和NULL类型。如果您想使用其他类型,您必须自己添加对它们的支持。使用模块级函数注册的 detect_types参数和使用自定义转换器register_converter()可以轻松地执行此操作。detect_types缺省值为0(即关闭,无类型检测),可以将其设置为任意组合PARSE_DECLTYPESPARSE_COLNAMES开启类型检测上。默认情况下,sqlite3模块使用其Connection类进行连接调用。但是,您可以通过为工厂 参数提供类来替代Connection类并 connect()使用您的类。有关详细信息,请参阅本手册的SQLite和Python类型部分。该sqlite3模块在内部使用语句缓存来避免SQL解析开销。如果要显式设置为连接缓存的语句数,可以设置cached_statements参数。当前实现的默认值是缓存100个语句。

    • sqlite3.``register_convertertypenamecallable

      注册callable以将数据库中的bytestring转换为自定义Python类型。将为typename类型的所有数据库值调用callable 。赋予 函数的参数detect_typesconnect()进行类型检测的工作方式。请注意,typename的大小写和查询中类型的名称必须匹配!

    • sqlite3.``register_adapter类型可调用

      注册callable以将自定义Python类型类型转换为SQLite支持的类型之一。可调用的callable接受Python值作为单个参数,并且必须返回以下类型的值:int,long,float,str(UTF-8编码),unicode或buffer。

    • sqlite3.``complete_statementsql

      返回True如果字符串SQL包含由分号终止一个或多个完整的SQL语句。它不验证SQL在语法上是否正确,只是没有未闭合的字符串文字,并且语句以分号结束。这可以用于为SQLite构建一个shell,如下例所示:

    #最小SQLite shell的实验研究
    
    from pysqlite2 import dbapi2 as sqlite3
    
    con = sqlite3.connect(":memory:")
    con.isolation_level = None
    cur = con.cursor()
    
    buffer = ""
    
    print "Enter your SQL commands to execute in SQLite."
    print "Enter a blank line to exit."
    
    while True:
        line = raw_input()
        if line == "":
            break
        buffer += line
        if sqlite3.complete_statement(buffer):
            try:
                buffer = buffer.strip()
                cur.execute(buffer)
    
                if buffer.lstrip().upper().startswith("SELECT"):
                    print cur.fetchall()
            except sqlite3.Error, e:
                print "An error occurred:", e.args[0]
            buffer = ""
    
    con.close()
    
    • sqlite3.``enable_callback_tracebacks

      默认情况下,您不会在用户定义的函数,聚合,转换器,授权器回调等中获得任何回溯。如果要调试它们,可以使用标记为True 来调用此函数。之后,您将从回调中获得追溯sys.stderr。用于False再次禁用该功能。

    连接对象

    • sqlite3.``Connection

      SQLite数据库连接具有以下属性和方法:

    • Connection.``isolation_level

      获取或设置当前隔离级别。None用于自动提交模式或“DEFERRED”,“IMMEDIATE”或“EXCLUSIVE”之一。有关更详细的说明,请参阅控制事务一节。

    • Connection.``cursor([cursorClass ])

      cursor方法接受一个可选参数cursorClass。如果提供,则必须是扩展的自定义游标类sqlite3.Cursor

    • Connection.``commit()

      此方法提交当前事务。如果不调用此方法,commit()则从上次调用以来执行的任何操作都不会从其他数据库连接中看到。如果您想知道为什么没有看到您写入数据库的数据,请检查您是否忘记调用此方法。

    • Connection.``rollback()

      自上次调用以来,此方法回滚对数据库的任何更改 commit()

    • Connection.``close()

      这将关闭数据库连接。请注意,这不会自动调用commit()。如果您只是先关闭数据库连接而不commit()先打电话,那么您的更改将会丢失!

    • Connection.``executesql [,参数])

      这是一个非标准的快捷方式,它通过调用cursor方法创建一个中间游标对象,然后execute使用给定的参数调用游标的 方法。

    • Connection.``executemanysql [,参数])

      这是一个非标准的快捷方式,它通过调用cursor方法创建一个中间游标对象,然后executemany使用给定的参数调用游标的 方法。

    • Connection.``executescriptsql_script

      这是一个非标准的快捷方式,它通过调用cursor方法创建一个中间游标对象,然后executescript使用给定的参数调用游标的 方法。

    • Connection.``create_functionnamenum_paramsfunc

      创建一个可以从SQL语句中以后使用下面的功能名称的用户定义函数的名称num_params是函数接受的参数个数,func是Python可调用的,被称为SQL函数。该函数可以返回SQLite支持的任何类型:unicode,str,int,long,float,buffer和None。

      例:创建一个可以从SQL语句中以后使用下面的功能名称的用户定义函数的名称num_params是函数接受的参数个数,func是Python可调用的,被称为SQL函数。该函数可以返回SQLite支持的任何类型:unicode,str,int,long,float,buffer和None。例:

    from pysqlite2 import dbapi2 as sqlite3
    import md5
    
    def md5sum(t):
        return md5.md5(t).hexdigest()
    
    con = sqlite3.connect(":memory:")
    con.create_function("md5", 1, md5sum)
    cur = con.cursor()
    cur.execute("select md5(?)", ("foo",))
    print cur.fetchone()[0]
    

    Connection.``create_aggregatenamenum_paramsaggregate_class

    创建用户定义的聚合函数。

    聚合类必须实现一个step方法,该方法接受参数num_params的数量,以及一个finalize将返回聚合的最终结果的方法。

    finalize方法可以返回SQLite支持的任何类型:unicode,str,int,long,float,buffer和None。

    from pysqlite2 import dbapi2 as sqlite3
    
    class MySum:
        def __init__(self):
            self.count = 0
    
        def step(self, value):
            self.count += value
    
        def finalize(self):
            return self.count
    
    con = sqlite3.connect(":memory:")
    con.create_aggregate("mysum", 1, MySum)
    cur = con.cursor()
    cur.execute("create table test(i)")
    cur.execute("insert into test(i) values (1)")
    cur.execute("insert into test(i) values (2)")
    cur.execute("select mysum(i) from test")
    print cur.fetchone()[0]
    

    Connection.``create_collation名称可调用

    创建具有指定名称可调用的排序规则。callable将传递两个字符串参数。如果第一个排序低于第二个,则应返回-1;如果排序等于0,则返回0;如果第一个排序高于第二个,则返回1。请注意,这会控制排序(SQL中的ORDER BY),因此您的比较不会影响其他SQL操作。

    请注意,callable将其参数作为Python字节串,通常以UTF-8编码。

    以下示例显示了对“错误方式”进行排序的自定义排序规则:

    from pysqlite2 import dbapi2 as sqlite3
    
    def collate_reverse(string1, string2):
        return -cmp(string1, string2)
    
    con = sqlite3.connect(":memory:")
    con.create_collation("reverse", collate_reverse)
    
    cur = con.cursor()
    cur.execute("create table test(x)")
    cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
    cur.execute("select x from test order by x collate reverse")
    for row in cur:
        print row
    con.close()
    

    要删除排序规则,请create_collation使用None作为callable调用:

    con.create_collation("reverse", None)
    
    • Connection.``interrupt()

      您可以从其他线程调用此方法以中止可能在连接上执行的任何查询。然后查询将中止,调用者将获得异常。

    • Connection.``set_authorizerauthorizer_callback

      此例程注册回调。每次尝试访问数据库中表的列时都会调用回调。SQLITE_OK如果允许访问,SQLITE_DENY则应该返回回调 ,如果整个SQL语句应该中止并出现错误,SQLITE_IGNORE并且该列应该被视为NULL值。这些常量在sqlite3模块中可用 。回调的第一个参数表示要授权的操作类型。第二个和第三个参数将是参数或None 取决于第一个参数。第四个参数是数据库的名称(“main”,“temp”等)(如果适用)。第五个参数是负责访问尝试的最内层触发器或视图的名称,或者 None此访问尝试是否直接来自输入SQL代码。请参阅SQLite文档,了解第一个参数的可能值以及第二个和第三个参数的含义,具体取决于第一个参数。sqlite3模块中提供了所有必需的常量。

    • Connection.``get_limitlimit_id

      此例程返回由常量limit_id指定的限制的当前值。有关limit_id参数的可能值,请参阅SQLite文档。

    • Connection.``set_limitlimit_idnew_value

      此例程为常量limit_id指定的限制设置新值。有关limit_id参数的可能值,请参阅SQLite文档。

    • Connection.``set_progress_handler处理程序n

      此例程注册回调。 对SQLite虚拟机的每n个指令调用回调。如果要在长时间运行的操作期间从SQLite调用(例如更新GUI),这将非常有用。如果要清除以前安装的任何进度处理程序,请使用Nonefor handler调用该方法。

    • Connection.``enable_load_extension启用

      此例程允许/禁止SQLite引擎从共享库加载SQLite扩展。SQLite扩展可以定义新功能,聚合或全新的虚拟表实现。一个众所周知的扩展是与SQLite一起分发的全文搜索扩展。

    from pysqlite2 import dbapi2 as sqlite3
    
    con = sqlite3.connect(":memory:")
    
    # 加载全文搜索扩展名
    con.enable_load_extension(True)
    
    # 或者您可以使用API调用加载扩展名
    con.execute("select load_extension('./fts3.so')")
    
    # 或者,可以使用API加载扩展。
    call:
    # con.load_extension("./fts3.so")
    
    # 禁用扩展laoding
    con.enable_load_extension(False)
    
    # SQLite维基实例
    con.execute("create virtual table recipe using fts3(name, ingredients)")
    con.executescript("""
        insert into recipe (name, ingredients) values ('broccoli stew', 'broccoli peppers cheese tomatoes');
        insert into recipe (name, ingredients) values ('pumpkin stew', 'pumpkin onions garlic celery');
        insert into recipe (name, ingredients) values ('broccoli pie', 'broccoli cheese onions flour');
        insert into recipe (name, ingredients) values ('pumpkin pie', 'pumpkin sugar flour butter');
        """)
    for row in con.execute("select rowid, name, ingredients from recipe where name match 'pie'"):
        print row
    
    • Connection.``load_extension路径

      此例程从共享库加载SQLite扩展。您必须先启用扩展加载,enable_load_extension然后才能使用此例程。

    • Connection.``row_factory

      您可以将此属性更改为可接受游标和原始行作为元组的可调用对象,并返回实际结果行。这样,您可以实现更高级的返回结果的方法,例如返回一个也可以按名称访问列的对象。例:

    from pysqlite2 import dbapi2 as sqlite3
    
    def dict_factory(cursor, row):
        d = {}
        for idx, col in enumerate(cursor.description):
            d[col[0]] = row[idx]
        return d
    
    con = sqlite3.connect(":memory:")
    con.row_factory = dict_factory
    cur = con.cursor()
    cur.execute("select 1 as a")
    print cur.fetchone()["a"]
    
    • Connection.``text_factory

      使用此属性可以控制为TEXT 数据类型返回的对象。默认情况下,此属性设置为unicodesqlite3模块将返回Unicode对象TEXT。如果要返回字节串,可以将其设置为str。出于效率原因,还有一种方法只返回非ASCII数据的Unicode对象,否则返回字节串。要激活它,请将此属性设置为 sqlite3.OptimizedUnicode。您还可以将其设置为接受单个bytestring参数的任何其他可调用对象,并返回结果对象。请参阅以下示例代码以进行说明:

    from pysqlite2 import dbapi2 as sqlite3
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    
    # 创建表
    con.execute("create table person(lastname, firstname)")
    
    AUSTRIA = u"\xd6sterreich"
    
    # 默认情况下,行返回为Unicode
    cur.execute("select ?", (AUSTRIA,))
    row = cur.fetchone()
    assert row[0] == AUSTRIA
    
    # 但我们可以让pysqlite总是返回bytestrings ... 
    con.text_factory = str
    cur.execute("select ?", (AUSTRIA,))
    row = cur.fetchone()
    assert type(row[0]) == str
    # 字节串将被编码在UTF-8中,除非您将存储垃圾
    # 到数据库 ...
    assert row[0] == AUSTRIA.encode("utf-8")
    
    # 我们也可以实现一个定制的text_factory…
    # 这里我们从UTF-8解码实现了一个忽略Unicode字符的方法。
    con.text_factory = lambda x: unicode(x, "utf-8", "ignore")
    cur.execute("select ?", ("this is latin1 and would normally create errors" + u"\xe4\xf6\xfc".encode("latin1"),))
    row = cur.fetchone()
    assert type(row[0]) == unicode
    #pysqlite 提供了一个构建优化的 text_factory,它将返回字节串。
    #对象,如果数据仅在ASCII中,则返回Unicode对象。
    con.text_factory = sqlite3.OptimizedUnicode
    cur.execute("select ?", (AUSTRIA,))
    row = cur.fetchone()
    assert type(row[0]) == unicode
    
    cur.execute("select ?", ("Germany",))
    row = cur.fetchone()
    assert type(row[0]) == str
    
    • Connection.``total_changes

      返回自打开数据库连接以来已修改,插入或删除的数据库行的总数。

    • Connection.``iterdump

      返回以SQL文本格式转储数据库的迭代器。保存内存数据库以便以后恢复时很有用。此函数提供与sqlite3 shell中的.dump命令相同的功能。例:

    #将文件existing_db.db转换为SQL转储文件dump.sql
    import sqlite3, os
    
    con = sqlite3.connect('existing_db.db')
    full_dump = os.linesep.join([line for line in con.iterdump()])
    f = open('dump.sql', 'w')
    f.writelines(full_dump)
    f.close()
    

    游标对象

    一个Cursor实例具有以下属性和方法:

    SQLite数据库游标具有以下属性和方法:

    • Cursor.``close()

      现在关闭光标(而不是每次调用__del__)。从这一点开始,光标将无法使用; 如果使用游标尝试任何操作,将引发错误(或子类)异常。

    • Cursor.``executesql [,参数])

      执行SQL语句。SQL语句可以是参数化的(即占位符而不是SQL文本)。该sqlite3模块支持两种占位符:问号(qmark样式)和命名占位符(命名样式)。此示例显示如何使用qmark样式的参数:

    from pysqlite2 import dbapi2 as sqlite3
    
    con = sqlite3.connect("mydb")
    
    cur = con.cursor()
    
    who = "Yeltsin"
    age = 72
    
    cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
    print cur.fetchone()
    

    此示例显示如何使用命名样式:

    from pysqlite2 import dbapi2 as sqlite3
    
    con = sqlite3.connect("mydb")
    
    cur = con.cursor()
    
    who = "Yeltsin"
    age = 72
    
    cur.execute("select name_last, age from people where name_last=:who and age=:age",
        {"who": who, "age": age})
    print cur.fetchone()
    
    • Cursor.``executemanysqlseq_of_parameters

      对序列sql中找到的所有参数序列或映射执行SQL命令。该sqlite3模块还允许使用 迭代器产生参数而不是序列。

    from pysqlite2 import dbapi2 as sqlite3
    
    class IterChars:
        def __init__(self):
            self.count = ord('a')
    
        def __iter__(self):
            return self
    
        def next(self):
            if self.count > ord('z'):
                raise StopIteration
            self.count += 1
            return (chr(self.count - 1),) #这是一个 1-tuple
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur.execute("create table characters(c)")
    
    theIter = IterChars()
    cur.executemany("insert into characters(c) values (?)", theIter)
    
    cur.execute("select c from characters")
    print cur.fetchall()
    

    这是使用生成器的简短示例:

    from pysqlite2 import dbapi2 as sqlite3
    
    def char_generator():
        import string
        for c in string.letters[:26]:
            yield (c,)
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur.execute("create table characters(c)")
    
    cur.executemany("insert into characters(c) values (?)", char_generator())
    
    cur.execute("select c from characters")
    print cur.fetchall()
    

    Cursor.``executescriptsql_script

    这是一次执行多个SQL语句的非标准方便方法。它首先发出一个COMMIT语句,然后执行它作为参数获取的SQL脚本。

    sql_script可以是bytestring或Unicode字符串。

    例:

    from pysqlite2 import dbapi2 as sqlite3
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur.executescript("""
        create table person(
            firstname,
            lastname,
            age
        );
    
        create table book(
            title,
            author,
            published
        );
    
        insert into book(title, author, published)
        values (
            'Dirk Gently''s Holistic Detective Agency',
            'Douglas Adams',
            1987
        );
        """)
    
    • Cursor.``fetchone()

      获取查询结果集的下一行,返回单个序列,或者None当没有更多数据可用时。

    • Cursor.``fetchmany([size = cursor.arraysize ])

      获取查询结果的下一组行,返回一个列表。当没有更多行可用时,返回空列表。每次调用获取的行数由size参数指定。如果未给出,则游标的arraysize确定要获取的行数。该方法应尝试获取size参数指示的行数。如果由于指定的行数不可用而无法执行此操作,则可能返回的行数较少。请注意,size参数涉及性能方面的考虑因素。为获得最佳性能,通常最好使用arraysize属性。如果使用size参数,那么最好从一次fetchmany()调用到下一次调用保留相同的值。

    • Cursor.``fetchall()

      获取查询结果的所有(剩余)行,返回列表。请注意,游标的arraysize属性可能会影响此操作的性能。没有可用行时返回空列表。

    • Cursor.``rowcount

      虽然模块的Cursorsqlite3实现了这个属性,但是数据库引擎自己支持确定“受影响的行”/“选择的行”是古怪的。对于DELETE语句,rowcount如果您没有任何条件,SQLite将报告为0 。DELETE FROM table对于executemany()陈述,修改的数量总结为rowcount。根据Python DB API Spec的要求,rowcount如果没有executeXX()对游标执行或者最后一个操作的rowcount不能被接口确定,则属性“为-1 ”。这包括SELECT语句,因为在获取所有行之前,我们无法确定查询生成的行数。

    • Cursor.``lastrowid

      此只读属性提供上次修改行的rowid。仅当您INSERT使用该execute() 方法发出声明时才设置它。对于调用以外的操作INSERTexecutemany()调用的操作,lastrowid设置为None

    • Cursor.``description

      此只读属性提供上一个查询的列名称。为了与Python DB API保持兼容,它为每个列返回一个7元组,其中每个元组的最后六个项是None。它是为SELECT没有任何匹配行的语句设置的。

    行对象

    • sqlite3.``Row

      Row实例用作一个高度优化的 row_factory用于Connection对象。它试图模仿其大部分功能中的元组。它支持按列名和索引,迭代,表示,等式测试和映射访问len()。如果两个Row对象具有完全相同的列并且它们的成员相等,则它们相等。在2.6版中更改:添加了迭代和相等(hashability)。keys()此方法返回列名称元组。在查询之后,它立即成为每个元组的第一个成员Cursor.description。版本2.6中的新功能。

    假设我们初始化一个表,如上面给出的例子:

    conn = sqlite3.connect(":memory:")
    c = conn.cursor()
    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()
    c.close()
    

    现在我们插入Row

    >>> conn.row_factory = sqlite3.Row
    >>> c = conn.cursor()
    >>> c.execute('select * from stocks')
    <sqlite3.Cursor object at 0x7f4e7dd8fa80>
    >>> r = c.fetchone()
    >>> type(r)
    <type 'sqlite3.Row'>
    >>> r
    (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
    >>> len(r)
    5
    >>> r[2]
    u'RHAT'
    >>> r.keys()
    ['date', 'trans', 'symbol', 'qty', 'price']
    >>> r['qty']
    100.0
    >>> for member in r: print member
    ...
    2006-01-05
    BUY
    RHAT
    100.0
    35.14
    

    SQLite和Python类型

    介绍

    SQLite的原生支持以下几种类型:NULLINTEGERREALTEXTBLOB

    因此可以将以下Python类型发送到SQLite而不会出现任何问题:

    Python类型SQLite类型
    NoneNULL
    intINTEGER
    longINTEGER
    floatREAL
    str (UTF8编码)TEXT
    unicodeTEXT
    bufferBLOB

    这是默认情况下SQLite类型转换为Python类型的方式:

    SQLite类型Python类型
    NULLNone
    INTEGERint或者long,视大小而定
    REALfloat
    TEXT取决于text_factoryunicode在默认情况下
    BLOBbuffer

    sqlite3模块的类型系统可以通过两种方式进行扩展:您可以通过对象自适应将其他Python类型存储在SQLite数据库中,您可以让sqlite3模块通过转换器将SQLite类型转换为不同的Python类型。

    使用适配器在SQLite数据库中存储其他Python类型

    如前所述,SQLite本身仅支持一组有限的类型。要在SQLite中使用其他Python类型,必须使它们适应 SQLite 的sqlite3模块支持的类型之一:NoneType,int,long,float,str,unicode,buffer之一。

    sqlite3模块使用Python对象自适应,如中所述 PEP 246为此。要使用的协议是PrepareProtocol

    有两种方法可以使sqlite3模块使自定义Python类型适应其中一种受支持的类型。

    让你的对象适应自己

    如果您自己编写课程,这是一个很好的方法。我们假设您有一个这样的类:

    class Point(object):
        def __init__(self, x, y):
            self.x, self.y = x, y
    

    现在,您希望将该点存储在单个SQLite列中。首先,您必须首先选择一种支持的类型来表示该点。让我们使用str并使用分号分隔坐标。然后你需要给你的类一个必须返回转换值的方法。参数协议将是。__conform__(self, protocol)``PrepareProtocol

    from pysqlite2 import dbapi2 as sqlite3
    
    class Point(object):
        def __init__(self, x, y):
            self.x, self.y = x, y
    
        def __conform__(self, protocol):
            if protocol is sqlite3.PrepareProtocol:
                return "%f;%f" % (self.x, self.y)
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    
    p = Point(4.0, -3.2)
    cur.execute("select ?", (p,))
    print cur.fetchone()[0]
    

    注册可调用的适配器

    另一种可能性是创建一个函数,将类型转换为字符串表示并注册函数register_adapter()

    注意

    要适应的类型/类必须是新式类,即它必须 object作为其基础之一。

    from pysqlite2 import dbapi2 as sqlite3
    
    class Point(object):
        def __init__(self, x, y):
            self.x, self.y = x, y
    
    def adapt_point(point):
        return "%f;%f" % (point.x, point.y)
    
    sqlite3.register_adapter(Point, adapt_point)
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    
    p = Point(4.0, -3.2)
    cur.execute("select ?", (p,))
    print cur.fetchone()[0]
    

    sqlite3模块有两个默认适配器,用于Python的内置 datetime.datedatetime.datetime类型。现在让我们假设我们想要存储datetime.datetime不在ISO表示中的对象,而是存储为Unix时间戳。

    from pysqlite2 import dbapi2 as sqlite3
    import datetime, time
    
    def adapt_datetime(ts):
        return time.mktime(ts.timetuple())
    
    sqlite3.register_adapter(datetime.datetime, adapt_datetime)
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    
    now = datetime.datetime.now()
    cur.execute("select ?", (now,))
    print cur.fetchone()[0]
    

    将SQLite值转换为自定义Python类型

    编写适配器允许您将自定义Python类型发送到SQLite。但是为了使它真正有用,我们需要使Python到SQLite到Python的往返工作。

    输入转换器。

    我们回到Point课堂上吧。我们存储了x和y坐标,这些坐标通过分号分隔为SQLite中的字符串。

    首先,我们将定义一个转换器函数,它接受字符串作为参数并Point从中构造一个对象。

    注意

    无论您将值发送到SQLite的哪种数据类型,都始终使用字符串调用转换器函数。

    def convert_point(s):
        x, y = map(float, s.split(";"))
        return Point(x, y)
    

    现在,您需要让sqlite3模块知道您从数据库中选择的内容实际上是一个要点。有两种方法可以做到这一点:

    • 隐含地通过声明的类型
    • 明确地通过列名称

    两种方式在模块函数和常量一节中描述,在常量PARSE_DECLTYPES和条目中PARSE_COLNAMES

    以下示例说明了这两种方法。

    from pysqlite2 import dbapi2 as sqlite3
    
    class Point(object):
        def __init__(self, x, y):
            self.x, self.y = x, y
    
        def __repr__(self):
            return "(%f;%f)" % (self.x, self.y)
    
    def adapt_point(point):
        return "%f;%f" % (point.x, point.y)
    
    def convert_point(s):
        x, y = map(float, s.split(";"))
        return Point(x, y)
    
    # 注册适配器
    sqlite3.register_adapter(Point, adapt_point)
    
    # 注册转换器
    sqlite3.register_converter("point", convert_point)
    
    p = Point(4.0, -3.2)
    
    #########################
    # 1) 使用声明的类型
    con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
    cur = con.cursor()
    cur.execute("create table test(p point)")
    
    cur.execute("insert into test(p) values (?)", (p,))
    cur.execute("select p from test")
    print "with declared types:", cur.fetchone()[0]
    cur.close()
    con.close()
    
    #######################
    # 1) 使用列名
    con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
    cur = con.cursor()
    cur.execute("create table test(p)")
    
    cur.execute("insert into test(p) values (?)", (p,))
    cur.execute('select p as "p [point]" from test')
    print "with column names:", cur.fetchone()[0]
    cur.close()
    con.close()
    

    默认适配器和转换器

    datetime模块中的日期和日期时间类型有默认适配器。它们将作为ISO日期/ ISO时间戳发送给SQLite。

    默认转换器在名称“date”下注册,名称为 datetime.date“timestamp” datetime.datetime

    这样,在大多数情况下,您可以使用Python中的日期/时间戳,而无需任何额外的摆弄。适配器的格式也与实验SQLite日期/时间函数兼容。

    以下示例演示了这一点。

    from pysqlite2 import dbapi2 as sqlite3
    import datetime
    
    con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
    cur = con.cursor()
    cur.execute("create table test(d date, ts timestamp)")
    
    today = datetime.date.today()
    now = datetime.datetime.now()
    
    cur.execute("insert into test(d, ts) values (?, ?)", (today, now))
    cur.execute("select d, ts from test")
    row = cur.fetchone()
    print today, "=>", row[0], type(row[0])
    print now, "=>", row[1], type(row[1])
    
    cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')
    row = cur.fetchone()
    print "current_date", row[0], type(row[0])
    print "current_timestamp", row[1], type(row[1])
    

    控制事务

    默认情况下,sqlite3模块在数据修改语言(DML)语句(即INSERT/ UPDATE/ DELETE/ REPLACE)之前隐式打开事务 ,并在非DML非查询语句(即除SELECT上述内容之外的任何内容)之前隐式提交事务。

    所以,如果你是一个事务中,并发出这样的命令,,,该模块将隐式执行该命令之前提交。这样做有两个原因。首先,其中一些命令在事务中不起作用。另一个原因是pysqlite需要跟踪事务状态(如果事务处于活动状态)。CREATE TABLE ...``VACUUM``PRAGMAsqlite3

    您可以BEGIN通过 调用的isolation_level参数connect()或通过isolation_level连接属性来控制sqlite3隐式执行哪种语句(或根本不执行)。

    如果需要自动提交模式,则设置isolation_level为“无”。

    否则将其保留为默认值,这将产生一个简单的“BEGIN”语句,或将其设置为SQLite支持的隔离级别之一:“DEFERRED”,“IMMEDIATE”或“EXCLUSIVE”。

    sqlite3有效使用

    使用快捷方式

    使用非标准的execute()executemany()并且 executescript()该方法的Connection对象,您的代码可以更简洁,因为你不必创建(通常是多余的)书面Cursor明确对象。而是Cursor 隐式创建对象,这些快捷方法返回游标对象。这样,您可以执行SELECT语句并直接使用Connection对象上的单个调用对其进行迭代。

    from pysqlite2 import dbapi2 as sqlite3
    
    persons = [
        ("Hugo", "Boss"),
        ("Calvin", "Klein")
        ]
    
    con = sqlite3.connect(":memory:")
    
    # 创建表
    con.execute("create table person(firstname, lastname)")
    
    # 填表
    con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
    
    # 打印表格内容
    for row in con.execute("select firstname, lastname from person"):
        print row
    
    # 使用虚拟WHERE子句不让SQLite删除快捷方式表。
    print "I just deleted", con.execute("delete from person where 1=1").rowcount, "rows"
    

    按名称而不是索引访问列

    sqlite3模块的一个有用功能是内置 sqlite3.Row类,设计用来作为一个row factory.。

    用这个类包装的行既可以通过索引(如元组)访问,也可以通过名称不区分大小写:

    from pysqlite2 import dbapi2 as sqlite3
    
    con = sqlite3.connect("mydb")
    con.row_factory = sqlite3.Row
    
    cur = con.cursor()
    cur.execute("select name_last, age from people")
    for row in cur:
        assert row[0] == row["name_last"]
        assert row["name_last"] == row["nAmE_lAsT"]
        assert row[1] == row["age"]
        assert row[1] == row["AgE"]
    

    使用连接作为上下文管理器

    使用Python 2.5或更高版本,连接对象可以用作自动提交或回滚事务的上下文管理器。如果发生异常,则回滚事务; 否则,事务提交:

    from __future__ import with_statement
    from pysqlite2 import dbapi2 as sqlite3
    
    con = sqlite3.connect(":memory:")
    con.execute("create table person (id integer primary key, firstname varchar unique)")
    
    # Successful, con.commit() is called automatically afterwards
    with con:
        con.execute("insert into person(firstname) values (?)", ("Joe",))
    
    # con.rollback() is called after the with block finishes with an exception, the
    # exception is still raised and must be catched
    try:
        with con:
            con.execute("insert into person(firstname) values (?)", ("Joe",))
    except sqlite3.IntegrityError:
        print "couldn't add Joe twice"
    

    常见问题

    多线程

    较旧的SQLite版本在线程之间共享连接存在问题。这就是Python模块不允许在线程之间共享连接和游标的原因。如果您仍然尝试这样做,您将在运行时获得异常。

    唯一的例外是调用interrupt()方法,只有从不同的线程调用才有意义。


    © Copyright 2008-2015, Gerhard Häring. Revision c3fd30d3aa727319e65ec5eb74701a76a496aac5.

    Built with Sphinx using a theme provided by Read the Docs

    .

    展开全文
  • jQuery——实现一个3D动态轮播图

    千次阅读 2018-05-25 21:42:31
    css代码:&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"...width=device-width, initial-scale=1, maximum-scale
  • opencv转eigen数据结构笔记

    千次阅读 2019-04-24 16:41:37
    t.y()=cvT.at(1,3); t.z()=cvT.at(2,3); } 4.Eigen R,t->T T->R,t void Rt2T(Eigen::Matrix3d R,Eigen::Vector3d t,Eigen::Matrix4d& T) { T(0,0),R(0,1),R(0,2),t(0), R(1,0),R(1,1),R(1,2),t(1), R(2,0...
  • CoordinateConverter converter = new CoordinateConverter ( ) ; // CoordType.GPS 待转换坐标类型 converter . from ( CoordinateConverter . CoordType . GPS ) ; // sourceLatLng待转换坐标点 ...
  • 通过costmap_converter跟踪并包含动态障碍物 在本教程中,学习如何利用代价地图转换器根据代价地图更新轻松跟踪动态障碍。 常见问题 此页面试图回答和解释有关 teb_local_planner 的常见问题。 ...
  • sudo tee \ /etc/apt/sources.list.d/clickhouse.list sudo apt-get update sudo apt-get install -y clickhouse-server clickhouse-client sudo service clickhouse-server start clickhouse-client 参考:...
  • ClickHouse 快速开始

    2021-11-26 00:51:57
    sudo tee \ /etc/apt/sources.list.d/clickhouse.list sudo apt-get update sudo apt-get install -y clickhouse-server clickhouse-client sudo service clickhouse-server start clickhouse-client 参考:...
  • yum install -y git \ pcre pcre-devel openssl \ libevent libevent-devel \ perl unzip net-tools \ autoconf libtool vim \ zlib zlib-devel \ make automake \ openssl-devel \ gcc gcc-c++ \ wget   2)...
  • 渗透之——Metasploit命令及模块

    万次阅读 2019-01-26 10:26:29
    3:直接从内存中执行攻击端的可执行文件 execute -H -m -d calc.exe -f wce.exe -a “-o foo.txt” -d选项设置需要显示的进程名 可执行文件(wce.exe)不需要在目标机上存储,不会留下痕迹 • getpid ...
  • Converter[], PointF[]>(PointToPointF)); for ( int i = 0 ; i ; i++) { RotatedRect rrec = CvInvoke.MinAreaRect(con2[i]); float w = rrec.Size.Width; float h = rrec.Size.Height; if (w / h...
  • libswscale常用的函数数量很少,一般情况下就3个:sws_getContext():初始化一个SwsContext。sws_scale():处理图像数据。 sws_freeContext():释放一个SwsContext。 其中sws_getContext()也可以用sws_getCa
  • ffmpeg -y -i input.mp3 -vcodec copy -af "volume=15dB" output_15dB.mp3 2 > /dev/null 若想把获取到的多个mp3录音文件合并为一个,可以用这个命令: ffmpeg -i "concat:1.mp3|2.mp3|3.mp3" -c copy ...
  • ORB-SLAM2地图加载

    千次阅读 热门讨论 2018-03-23 18:32:27
    cv::Mat R = Converter::toCvMat( Quat ); for ( int i = 0 ; i 3 ; i ++ ) f.read(( char *)&T.at< float >(i, 3 ), sizeof ( float )); for ( int i = 0 ; i 3 ; i ++ ) for ( int j = 0 ; ...
  • 移植——linux下使用3G拨号上网

    千次阅读 2013-07-12 21:50:04
    3 移植usb_modeswitch。 下载源代码包,并解压缩。对其进行修改,然后编译生成usb_modeswitch和usb_modeswitch.d,然后将usb_modeswitch下载到usr/sbin目录下,将usb_modeswitch.d下载到etc/目录下。 ...
  • S3C2440之触摸屏驱动

    2021-02-14 12:36:40
    3.注册input_dev结构体;4.硬件相关的操作 static int s3c_ts_init(void) { /* 1. 分配一个input_dev结构体 */ s3c_ts_dev = input_allocate_device(); /* 2. 设置 */ /* 2.1 能产生哪类事件 */ set_bit(E
  • Git详解之四:服务器上的Git

    千次阅读 2013-08-26 11:01:10
    3 4 5 $ cd /var/www/htdocs/   $ git clone --bare /path/to/git_project gitproject.git   $ cd gitproject.git   $ mv hooks /post-update .sample hooks /...
  • Flume 1.5.2 User Guide

    千次阅读 2015-05-03 21:15:09
    Introduction¶ Overview¶ Apache Flume is a distributed, reliable, and available system for efficiently collecting, aggregating and moving large amounts of log data from many different sources to ...
  • int j = threadIdx.y+(blockIdx.y*(blockDim.y)); int gx=0; int gy=0; int M=C[0]; int N=C1; while(i 然后报了跟我一样的错,然后他修改: copy_texture_func = mod_copy_texture.get_function("copy_texture_...
  • jquery-1.11.1.js

    千次阅读 2014-07-07 00:07:41
    每次想要使用这个js时,总是要到官网上下载,太麻烦,现在把它
  • Node type: converter (FLOW_NODE_TYPE_CONVERTER) [Y/n/m/?] y Node type: evdev (FLOW_NODE_TYPE_EVDEV) [M/n/y] m Node type: file (FLOW_NODE_TYPE_FILE) [M/n/y] m Node type: filter-repeated (FLOW_NODE_...
  • svn错误对照表

    千次阅读 2014-03-26 10:04:32
    #, c-format msgid "Destination '%s' is not a directory" msgstr "目的 “%s” 不是目录" #, c-format msgid "Destination '%s' already exists" msgstr "目的 “%s” 已存在" ...msgid "Can't read directory '...
  • 文章目录001 ADC硬件原理硬件...[s3c2440的ADC硬件原理图](https://img-blog.csdnimg.cn/20200212151829301.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ub...
  • python 100_Numpy_exercises (2)

    千次阅读 2019-03-13 09:47:14
    y : ndarray or scalar The truncated value of each element in `x`. See Also -------- ceil, floor, rint Notes ----- .. versionadded:: 1.3.0 Examples -------- >>> a = np.array([-1.7, -1.5, -0.2, 0.2,...
  •  input_set_abs_params(ts.dev,ABS_Y,0,0x3FF,0,0); //0x3FF:最大值为10位ADC  input_set_abs_params(ts.dev,ABS_PRESSURE,0,1,0,0); //压力最多就是1 3)注册input_dev驱动设备到内核中 4)设置触摸...
  • In [3]: pd.read_csv(StringIO(data), usecols=lambda x: x.upper() in ['COL1', 'COL3']) Out[3]: col1 col3 0 a 1 1 a 2 2 c 3 Using this parameter results in much faster parsing time and lower memory...
  • 美国ART (USART) The USB-to-USART converter/bridge is a serial port to your computer and is responsible for sending serial data over two wires. There is no clock signal and no parleying between the ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 882
精华内容 352
关键字:

converterytmp3